В 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
Надеюсь, это поможет.