ruby-on-rails – 多个应用语句在一个rspec it子句 – 坏主意?

这是我的rspec测试:
it "can release an idea" do
  james.claim(si_title)
  james.release(si_title)
  james.ideas.size.should eq 0
  si_title.status.should eq "available"
end

两个人应该在最后一行是一个非常糟糕的主意吗?我读到某个地方,你只应该测试一个块,但是,为了确保标题状态发生变化(同样的功能在我的代码中),似乎很愚蠢地做一个整体的测试.

解决方法

我对此的解释并不是这样,每个规范应该只有一个断言/呼吁,但是每个规范只应该有一点行为测试,所以例如
it 'should do foo and bar' do
  subject.do_foo.should be_true
  subject.do_bar.should be_true
end

是不好的 – 你同时指定了2种不同的行为.

另一方面,如果你的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,那么多个断言就可以了(实际上这样做实际上是值得的取决于你的情况)

在你特定的情况下,可以认为有两种行为在发挥 – 一种是改变状态,另一种则是突变思想收集.我将重写您的规范说出发布方法应该做什么 –

it 'should change the status to available'
it 'should remove the idea from the claimants ideas'

在这一刻,这些事情总是同时发生,但我会认为他们是独立的行为 – 你可以很容易地想象一个系统,多个人可以声明/发布一个想法,只有当最后一个人发布想法时,状态才会改变.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...