我已经在Rails中开始了我的TDD之旅,并且遇到了一个关于模型验证测试的小问题,我似乎找不到解决方案。比方说,我有一个用户模式,Rails 3.1,RSpec:测试模型验证
class User < ActiveRecord::Base
validates :username, :presence => true
end
和一个简单的测试
it "should require a username" do
User.new(:username => "").should_not be_valid
end
这正确测试存在验证,但如果我想更具体的是什么?例如,在错误检测full_messages对象..
it "should require a username" do
user = User.create(:username => "")
user.errors[:username].should ~= /can't be blank/
end
我关于初始尝试(使用should_not be_valid)关注的是,RSpec的不会产生描述性错误消息。它只是说“预计有效?返回假,是真的。”但是,第二个测试示例有一个小缺点:它使用create方法而不是新方法来获取错误对象。
我希望我的测试能够更具体地了解他们正在测试的内容,但同时不必触摸数据库。
任何人有任何输入?
非常感谢马修。有没有办法接近我试图测试的错误? X.should_not be_valid对我来说似乎很通用,谁知道在路上会有什么事会使记录失效。这个测试然后会在错误的地方失败。顺便说一下,我想我已经将你的答案标记为已接受。我不是吗? – Feech
对,所以这就是我为什么要争取工厂的原因。您编写代码以在一个地方生成一个有效的用户,然后您编写一个测试以确保在所有单个测试之前确保其有效,从而确保您可以使其失效。这样,如果由于某种原因,你改变了你的模型,所以工厂更长的时间产生一个有效的用户'Factory.build(:user).should be_valid'测试将失败,你会知道你必须更新你的工厂...得到它? (是的,你接受了我的答案) – Matthew
完美的解释。再次感谢。 – Feech