我已经开始了 Rails 中的 TDD 之旅,并且遇到了一个关于模型验证测试的小问题,我似乎找不到解决方案。假设我有一个用户模型,
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不会产生描述性错误消息。它只是说“预期有效?返回 false,得到 true”。然而,第二个测试示例有一个小缺点:它使用 create 方法而不是 new 方法来获取错误对象。
我希望我的测试能够更具体地说明他们正在测试的内容,但同时不必接触数据库。
有人有什么意见吗?
最佳答案
恭喜您通过 ROR 努力进入 TDD,我保证一旦您开始行动,您就不会回头。
最简单的快速但肮脏的解决方案是在每次测试之前生成一个新的有效模型,如下所示:
before(:each) do
@user = User.new
@user.username = "a valid username"
end
但我建议您为所有模型设置工厂,这些工厂将自动为您生成有效的模型,然后您可以混淆各个属性并查看您的验证是否有效。我喜欢用FactoryGirl为此:
基本上一旦你设置好你的测试就会像这样:
it "should have valid factory" do
FactoryGirl.build(:user).should be_valid
end
it "should require a username" do
FactoryGirl.build(:user, :username => "").should_not be_valid
end
这里是a good railscast这比我更好地解释了这一切:
<小时/>更新:截至version 3.0工厂女孩的语法已经改变。我修改了示例代码以反射(reflect)这一点。
关于ruby-on-rails - Rails 3.1,RSpec : testing model validations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7537112/