应该破坏我的回溯吗?

时间:2010-11-18 11:26:01

标签: ruby-on-rails ruby testing shoulda backtrace

我的测试或多或少是这样的:

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项目,如果这很重要的话。

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