在Ruby on Rails 3 Tutorial的第 6.2.4 节中,Michael Hartl 描述了一个关于检查电子邮件地址唯一性的警告:如果两个相同的请求及时接近,请求 A 可以通过验证,然后 B 通过验证,然后 A 被保存,然后B 被保存,你得到两个具有相同值的记录。每个在检查时都是有效的。
我的问题与解决方案无关(对数据库设置唯一约束,因此 B 的保存不起作用)。这是关于编写测试以证明解决方案有效。我尝试自己编写,但无论我想出什么,结果都只是模仿了常规的、简单的唯一性测试。
作为 rspec 的新手,我天真的方法是只编写场景:
it 'should reject duplicate email addresses with caveat' do
A = User.new( @attr )
A.should be_valid # always valid
B = User.new( @attr )
B.should be_valid # always valid, as expected
A.save.should == true # save always works fine
B.save.should == false # this is the problem case
# B.should_not be_valid # ...same results as "save.should"
end
但是该测试在与常规唯一性测试完全相同的情况下通过/失败;编写我的B.save.should == false
代码时通过,以便常规唯一性测试通过并在常规测试失败时失败。
所以我的问题是“我怎样才能编写一个 rspec 测试来验证我正在解决这个问题?” 如果答案是“它很复杂”,我应该看看不同的 Rails 测试框架吗?