我的测试或多或少是这样的:
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项目,如果这很重要的话。
答案 0 :(得分:1)
这是因为shoulda方法#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”为前缀)。有another example in the documentation for shoulda-context。
答案 1 :(得分:0)
我认为这会给你你想要的回溯。我没有测试过它,但它应该可以工作:
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
答案 2 :(得分:0)
您检查过config/initializers/backtrace_silencers.rb
吗?这是自定义该行为的入口点。使用Rails.backtrace_cleaner.remove_silencers!
,您可以清理消音器堆栈。
可以找到有关ActiveSupport::BacktraceCleaner
的更多信息here。