在我的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
我无法真正重现这种模式。很奇怪,很烦人/令人沮丧。任何帮助都非常感谢。
答案 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被多次加载并且导致它的原因应该变得很明显