我在Rails 3.1应用程序中有一个Contacts表。我希望last_name接受40个字符,所以在我的模型中我写了:length => { :maximum => 40 }
。但是,我的迁移中的拼写错误创建了带有:limit => 30
的last_name列。
我想知道为什么我的Rspec测试没有发现这个:
it "should allow last_name up to max length" do
long_field = "a" * 40
Contact.new(@attr.merge(:last_name => long_field)).should be_valid
end
然后我意识到这只是检查模型。如果我改用.create!
,那么测试就会失败:
it "should allow last_name up to max length" do
long_field = "a" * 40
Contact.create!(@attr.merge(:last_name => long_field)).should be_valid
end
所以问题是,在测试我的模型时,我应该总是使用.create!
吗?或者这太慢了?我怎样才能确保我的模型和数据库定义不冲突?
这也让我想知道我是否应该在数据库中将字符串保留为255并且只检查模型中的长度。
答案 0 :(得分:2)
出于速度原因,您应该尽可能多地使用.new。要使测试失败,您应该使用validates_length_of。至于字符串长度,理想情况下它们应该匹配,如果您感觉过于彻底,可以reflect on validations和Model.columns来验证您是否对每列进行了验证。