使用.new或.create!用Rspec测试Rails模型时?

时间:2011-11-03 01:04:51

标签: ruby-on-rails unit-testing rspec

我在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并且只检查模型中的长度。

1 个答案:

答案 0 :(得分:2)

出于速度原因,您应该尽可能多地使用.new。要使测试失败,您应该使用validates_length_of。至于字符串长度,理想情况下它们应该匹配,如果您感觉过于彻底,可以reflect on validations和Model.columns来验证您是否对每列进行了验证。