Подтвердить что ты не робот

Как организовать мини-тесты/единичные тесты?

После использования RSpec для нескольких проектов я даю minitest/unit a go. Мне это нравится до сих пор, но я пропустил использование блоков описания/контекста для логической логики моих тестов/спецификаций.

Я знаю, что minitest/spec предоставляет эту функциональность, но мне нравится, что minitest/unit чувствует себя немного ближе к barebone Ruby.

Есть ли какие-либо драгоценные камни, которые обеспечивают описание/контекстную поддержку для minitest/unit? Или, если я просто живу с моими длинными неорганизованными тестовыми файлами в minitest/unit?

4b9b3361

Ответ 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