运行所有规格时,某些规格会失败(有时),但是当仅运行特定文件时,它们会通过(始终)

时间:2014-06-22 13:29:28

标签: ruby-on-rails rspec

在我的Rails 4.1应用程序上运行$ rspec时,user_spec.rb中的某些规范失败了:

104 examples, 5 failures, 2 pending

所有5个错误都是因为某个字段上有两个错误而不是一个错误:

1) User creating a guest validates presence of name
   Failure/Error: expect(@guest).to have(1).error_on(:name)
     expected 1 error on :name, got 2
   # ./spec/models/user_spec.rb:43:in `block (3 levels) in <top (required)>'
   # -e:1:in `<main>'

错误总是加倍:@messages={:name=>["can't be blank", "can't be blank"]}>,但应该是这样的:@messages={:name=>["can't be blank"]}>

奇怪的是,当仅运行指定的文件($ rspec ./spec/models/user_spec.rb)时,这不会发生。

22 examples, 0 failures

我尝试了$ git bisect,但找不到问题。

因此,如果有人可以请尝试结帐https://github.com/jmuheim/communes/commit/0dee0d4983809bc19b6cb97ff9bab071fc866b02并运行规范($ rspec$ rspec ./spec/models/user_spec.rb)并告诉我是否发生了双重错误,并且可能会尝试帮我调试问题,我真的很感激。

我怀疑Spring应用程序预加载器可能是问题的一部分,因为有时候,在Spring明确停止($ spring stop)之后,$ rspec通过,有时它不会。无法找到一个模式,看起来很随机:

$ spring stop
Spring stopped.

$ rspec
Finished in 3.66 seconds
104 examples, 0 failures, 2 pending

$ spring stop
Spring stopped.

$ rspec
104 examples, 5 failures, 2 pending

我无法真正重现这种模式。很奇怪,很烦人/令人沮丧。任何帮助都非常感谢。

2 个答案:

答案 0 :(得分:2)

这是我在搜索类似问题时遇到的第一个答案,所以我想添加我发现的最有效保存其他人搜索的修复。

rspec 3.3+有一个--bisect命令,用于确定失败的最小测试子集。

使用已知失败的种子运行它,并让它生成一组您需要查看的规格。

rspec --seed 1245 --bisect

https://relishapp.com/rspec/rspec-core/docs/command-line/bisect

答案 1 :(得分:1)

您所拥有的是规范顺序依赖性问题:如果以前运行过某些其他规范,则您的用户规范将失败。当只运行用户规范时,它们就可以了。您已经设置了rspec以随机顺序运行规范(旨在揭示此类问题),这就是问题来来去去的原因。

听起来问题是第二次加载User类,这导致第二次添加验证。当规范失败时,rspec将输出一行,告诉你订购的种子是什么:如果你运行带有种子选项rss的规格,那么订单将保持不变,使你能够解决这个问题。

一种方法可能是在user.rb的顶部放置一个断点(或只是输出caller) - 如果user.rb被多次加载并且导致它的原因应该变得很明显