我对此的解释并不是说每个规范应该只有一个断言/调用should
,而是每个规范应该只测试一点行为,例如
it 'should do foo and bar' do
subject.do_foo.should be_true
subject.do_bar.should be_true
end
不好-您同时指定了两种不同的行为。
另一方面,如果您的 2 个断言只是验证一件事的不同方面,那么我可以接受,例如
it 'should return a prime integer' do
result = subject.do_x
result.should be_a(Integer)
result.foo.should be_prime
end
对我来说,让一个规范检查它是否返回一个整数和一个单独的规范检查它是否返回一个素数并没有太大意义。
当然,在这种情况下,be_prime 匹配器可以轻松地完成这两项检查 - 也许一个好的经验法则是,如果您可以使用自定义匹配器将多个断言合理地减少到 1,则多个断言是可以的(实际上这样做是否真的值得取决于你的情况)
在您的特定情况下,可以说有两种行为在起作用 - 一种是改变状态,另一种是改变ideas
集合。我会改写您的规格以说明发布方法应该做什么-
it 'should change the status to available'
it 'should remove the idea from the claimants ideas'
目前,这些事情总是同时发生,但我认为它们是独立的行为——你可以很容易地想象一个系统,多个人可以声明/发布一个想法,并且只有当最后一个人发布这个想法时状态才会改变。