Запуск одного теста с пробелами в Minitest

В Rails, если вы хотите запустить конкретный тест без остальных в файле, вы можете передать имя метода во флаге --name.

def test_controller_name
  # assert ...
end

>  ruby -I test test/controller/renderer_test.rb --name test_controller_name
Войти в полноэкранный режим Выйти из полноэкранного режима

Но Rails также предоставляет метод test, который принимает имя теста и блок.

test "creating from a controller" do
  # assert ...
end
Вход в полноэкранный режим Выход из полноэкранного режима

Как запустить этот тест, который позволяет передавать строку, содержащую пробелы?

Для этого нам нужно зайти внутрь метода test и посмотреть, что он делает. Если мы откроем исходный код метода test, вот что он делает:

def test(name, &block)
  test_name = "test_#{name.gsub(/s+/, '_')}".to_sym
  defined = method_defined? test_name
  raise "#{test_name} is already defined in #{self}" if defined
  if block_given?
    define_method(test_name, &block)
  else
    define_method(test_name) do
      flunk "No implementation provided for #{name}"
    end
  end
end
Входит в полноэкранный режим Выйти из полноэкранного режима

Первая строка заменяет все пробелы в строке name на символ подчеркивания _ и добавляет test в начало. Таким образом, имя теста creating from a controller становится test_creating_from_a_controller. Затем, используя метапрограммирование, он определяет метод с тем же именем. Таким образом, вышеприведенный метод теста становится:

def test_creating_from_a_controller
  # assert ...
end
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь, когда вы знаете имя, вы можете запустить этот тест следующим образом:

>  ruby -I test test/controller/renderer_test.rb -n test_creating_from_a_controller
Войти в полноэкранный режим Выйти из полноэкранного режима

Надеюсь, это поможет.

Оцените статью
Procodings.ru
Добавить комментарий