Как организовать мини-тесты/единичные тесты?
После использования RSpec для нескольких проектов я даю minitest/unit a go. Мне это нравится до сих пор, но я пропустил использование блоков описания/контекста для логической логики моих тестов/спецификаций.
Я знаю, что minitest/spec предоставляет эту функциональность, но мне нравится, что minitest/unit чувствует себя немного ближе к barebone Ruby.
Есть ли какие-либо драгоценные камни, которые обеспечивают описание/контекстную поддержку для minitest/unit? Или, если я просто живу с моими длинными неорганизованными тестовыми файлами в minitest/unit?
Ответы
Ответ 1
Я знаю, что несколько человек, приехавших из RSpec, стараются бороться с одним и тем же вопросом. Им нравится возможность гнездования с использованием блоков описания/контекста и вы хотите продолжить в мини-классе. Существует несколько решений:
- Использовать мини-версию DSL: несмотря на незначительные отличия, спецификация DSL дает вам больше всего (всех?) хороших частей DSL. Большая разница заключается в отсутствии блоков
context
. Но вы можете так же легко использовать describe
на своем месте, и все работает так, как вы ожидали.
- Использовать каталоги и файлы: я предпочитаю эту опцию. Мне не нравится прокручивать тестовый файл из 300 строк, независимо от того, использует ли он спецификацию DSL или классический стиль xUnit. Я не считаю, что вложенные несвязанные тесты полезны. Те же правила для понимания кода применяются к испытаниям. Так сломайте это. Создайте каталог и поместите в него несколько файлов.
Вот пример того, как организованы мои тестовые файлы:
test/
models/
user/
authentication_test.rb
email_test.rb
reservation_test.rb
user_test.rb
username_test.rb
Я использую эту структуру, использую ли я спецификацию DSL или стиль xUnit. При использовании спецификации DSL я указываю, что я тестирую в своем блоке описания следующим образом:
require "minitest_helper"
describe User, :authentications do
before do
# ...
Ответ 2
Вы также можете бросить несколько классов в один тестовый файл:
module PizzaTest
class Isolation < ActiveSupport::TestCase
test "is awesome by default" do
assert Pizza.new.awesome?
end
end
class Integration < ActiveSupport::TestCase
fixtures :all
test "is awesome too" do
pizzas('one-with-everything').awesome?
end
end
end
и даже классы тестирования гнезд:
class PizzaTest < ActiveSupport::TestCase
test "is awesome by default" do
assert Pizza.new.awesome?
end
class Integration < ActiveSupport::TestCase
fixtures :all
test "is awesome too" do
assert pizzas('one-with-everything').awesome?
end
end
end
Ответ 3
Я предпочитаю этот способ (только немного), но я думаю, что это проще:
class ConventionalNameTest < ActiveSupport::TestCase
class ContextTest < ConventionalNameTest
# so much stuff...
end
class AnotherContextTest < ConventionalNameTest
# and some more...
end
Ответ 4
Чтобы опираться на предыдущий ответ, я предпочитаю этот немного менее подробный вариант:
class ConventionalNameTest < ActiveSupport::TestCase
class ContextTest < self
# so much stuff...
end
class AnotherContextTest < self
# and some more...
end
end