11

我有一个或多或少这样的测试:

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 项目,以防万一。

4

3 回答 3

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块的所有上下文名称加上应该块提供的字符串(以“应该”为前缀)的串联。shoulda-context 的文档中还有另一个示例。

于 2012-10-30T09:06:21.307 回答
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
于 2012-04-30T00:07:40.193 回答
0

你检查过config/initializers/backtrace_silencers.rb吗?这是自定义该行为的入口点。Rails.backtrace_cleaner.remove_silencers!您可以清理消音器堆栈。

更多信息ActiveSupport::BacktraceCleaner可以在这里找到。

于 2012-05-04T09:02:45.773 回答