У меня тестовое зависание в нашем приложении rails не может определить, какой из них (поскольку он зависает и не попадает в отчет об отказе). Я нашел этот пост в блоге http://bmorearty.wordpress.com/2008/06/18/find-tests-more-easily-in-your-testlog/, который добавляет крючок настройки для печати имени теста, но когда я пытаюсь сделать то же самое, это дает мне ошибка с неправильным числом аргументов для установки (1 для 0). Любая помощь вообще будет оценена.
Rails test hang - как я могу распечатать тестовое имя перед исполнением?
Ответ 1
Если вы запускаете тест с использованием рейка, он будет работать:
rake test:units TESTOPTS="-v"
Ответ 2
Печать тестового имени лежит на TestRunner. Если вы используете тесты из командной строки, вы можете указать опцию -v, чтобы распечатать имена тестовых примеров.
Пример:
ruby test_Foo.rb -v
Loaded suite test_Foo
Started
test_blah(TestFoo): .
test_blee(TestFoo): .
Finished in 0.007 seconds.
2 tests, 15 assertions, 0 failures, 0 errors
Ответ 3
Это то, что я использую в test_helper.rb
class Test::Unit::TestCase
# ...
def setup_with_naming
unless @@named[self.class.name]
puts "\n#{self.class.name} "
@@named[self.class.name] = true
end
setup_without_naming
end
alias_method_chain :setup, :naming unless defined? @@aliased
@@aliased = true
end
Переменная @@aliased не позволяет повторно переименовать ее при запуске сразу нескольких файлов; @@named позволяет отображать имя перед каждым тестом (непосредственно перед первым запуском).
Ответ 4
Определение в блоге должно быть специфичным (метод установки (& block) определен в модуле Thoughtbot:: Shoulda в context.rb. shoulda.rb, тогда TestCase расширяет этот модуль).
Определение для чистого теста:: unit
# File test/unit/testcase.rb, line 100
def setup
end
что вы можете сделать, это
def setup
log_test
end
private
def log_test
if Rails::logger
# When I run tests in rake or autotest I see the same log message multiple times per test for some reason.
# This guard prevents that.
unless @already_logged_this_test
Rails::logger.info "\n\nStarting #{@method_name}\n#{'-' * (9 + @method_name.length)}\n"
end
@already_logged_this_test = true
end
изменить
если вы действительно не хотите редактировать свои файлы, вы можете рискнуть повторно открыть тестовый пример и вместо этого продолжить выполнение:
class Test::Unit::TestCase
alias :old_run :run
def run
log_test
old_run
end
end
это должно работать (у меня нет рубина, чтобы проверить, хотя)
Я сдаюсь! (в расстройстве)
Я проверил код и рельсы на самом деле делает магию за сценой, что, вероятно, почему переопределение запуска не работает.
Дело в том, что часть магии включает в себя ActiveSupport:: CallBack и создание обратных вызовов для настройки и срыва.
что означает
class Test::Unit::TestCase
setup :log_test
private
def log_test
if Rails::logger
# When I run tests in rake or autotest I see the same log message multiple times per test for some reason.
# This guard prevents that.
unless @already_logged_this_test
Rails::logger.info "\n\nStarting #{@method_name}\n#{'-' * (9 + @method_name.length)}\n"
end
@already_logged_this_test = true
end
end
end
должен определенно работать
и фактически выполняемые тесты с ним действительно работают. где я смущен, это то, что это первое, что я пробовал, и он потерпел неудачу с той же ошибкой, что и вы.
Ответ 5
Какую тестовую среду вы используете? Test/Unit?
Я бы посмотрел на RSpec, который предоставил бы немного больше контекста для ваших тестов. Вы также можете получить хороший HTML-отчет, который выглядит следующим образом:
RSpec Результат http://myskitch.com/robbyrussell/rspec_results-20070801-233809.jpg
Если бы у вас были какие-либо неудачные тесты, конкретный тест был бы красным, и он расширился бы до конкретных строк, где тест не смог обеспечить вам больше видимости того, почему тест не прошел, и где вы должны искать решение проблемы.
Ответ 6
Спасибо всем за помощь, я закончил тестирование и добавил вызов log_name в каждом из методов настройки для каждого тестового файла до того, как появились эти последние ответы на пару. Еще раз спасибо.