Должен ли я разрушить мои обратные пути?
У меня есть тест более или менее:
class FormDefinitionTest < ActiveSupport::TestCase
context "a form_definition" do
setup do
@definition = SeedData.form_definition
# ...
Я намеренно добавил
raise "blah"
где-то по дороге, и я получаю эту ошибку:
RuntimeError: blah
test/unit/form_definition_test.rb:79:in `__bind_1290079321_362430'
когда мне нужно что-то получить:
/Users/pupeno/projectx/db/seed/sheet_definitions.rb:17:in `sheet_definition': blah (RuntimeError)
from /Users/pupeno/projectx/db/seed/form_definitions.rb:4:in `form_definition'
from /Users/pupeno/projectx/test/unit/form_definition_test.rb:79
Любые идеи, которые дезинфицируют/разрушают мои обратные пути? Мое подозрительное - это потому, что когда исключение происходит внутри установки или должно произойти, это происходит.
Это проект Rails 3, если это важно.
Ответы
Ответ 1
Это потому, что метод toa #context
генерирует код для вас. для каждого блока #should
он генерирует полностью отдельный тест для вас, например,
class FormDefinitionTest < ActiveSupport::TestCase
context "a form_definition" do
setup do
@definition = SeedData.form_definition
end
should "verify some condition" do
assert something
end
should "verify some other condition" do
assert something_else
end
end
end
Затем #should
будет генерировать два полностью независимых теста (для двух вызовов #should
), который выполняет
@definition = SeedData.form_definition
assert something
и другой, который выполняет
@definition = SeedData.form_definition
assert something_else
Стоит отметить, что он не генерирует один тест, выполняющий все три шага в последовательности.
Эти сгенерированные блоки кодов имеют имена методов, например _bind_
, а сгенерированный тест имеют имя, которое представляет собой конкатенацию всех имен контекстов, перемещенных в блок should
, плюс строку, предоставленную блоком should (с префиксом "должен" ). Существует еще один пример в документации для shoulda-context.
Ответ 2
Я думаю, что это даст вам обратную трассировку, которую вы хотите. Я не тестировал его, но он должен работать:
def exclude_backtrace_from_location(location)
begin
yeild
rescue => e
puts "Error of type #{e.class} with message: #{e.to_s}.\nBacktrace:"
back=e.backtrace
back.delete_if {|b| b~=/\A#{location}.+/}
puts back
end
end
exclude_backrace_from_location("test/unit") do
#some shoulda code that raises...
end
Ответ 3
Вы отметили config/initializers/backtrace_silencers.rb
? Это точка входа для настройки этого поведения. С помощью Rails.backtrace_cleaner.remove_silencers!
вы можете очистить стек глушителей.
Более подробную информацию о ActiveSupport::BacktraceCleaner
можно найти здесь.