【问题标题】:Use .new or .create! when testing Rails models with Rspec?使用 .new 或 .create!使用 Rspec 测试 Rails 模型时?
【发布时间】:2011-11-03 12:35:49
【问题描述】:

我在 Rails 3.1 应用程序中有一个联系人表。我希望 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,并且只检查模型中的长度。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 最后回到这个细节。我使用的是:validates :length 而不是:validates_length_of,但是如果rspec 测试使用:new,任何一个都可以通过测试。换句话说,如果模型验证器正确但 DB 字段太短,则 :new 测试通过,因为它不写入数据库。我认为反射不会有帮助,因为它也没有检查数据库。迁移模型同步是一个手动过程似乎很奇怪。到目前为止,:create! 是我看到的唯一方法来测试数据库是否接受模型将提供的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    相关资源
    最近更新 更多