1

我刚开始使用 RSpec 和 Shoulda-matchers,我认为这里出了点问题。

在我的模型中,我有一个成员 displayname,它是这样验证的。

validates :displayname, :presence => false #just for this test.

在我的规范中,我写了这个

it { should validate_presence_of(:displayname) }

然而它正在过去。除非我切换到不应该,否则不应该失败吗?

编辑:它似乎只是表现得像我说的那样来验证存在,无论我说的是真还是假。我将其更改为 should_not 并开始失败,除非我完全删除了存在检查。验证存在的行为是否只是不使用您传递的任何布尔值?

4

3 回答 3

1

是的你是对的。您可以在验证中将任何随机值传递给:presence键。这意味着即使您添加以下任何内容,也会进行存在验证。

  1. 验证 :name, :presence => false
  2. 验证 :name, :presence => true
  3. 验证 :name, :presence => 'random'
  4. 验证 :name, :presence => nil

(也许上述验证方法更具可读性的版本validates_presence_of :attr_name不会引起任何此类混淆)

于 2013-04-23T19:42:44.387 回答
1

shoulda-matchers 中的validates_presence_of匹配器不会对字段进行验证以查看其是否具有值。它仅验证模型是否验证了其上声明的属性的存在。如果您担心验证是否真的有效,则需要更多测试。

这就是当您将断言从 更改为 时测试开始失败的should原因should_not

于 2013-04-23T20:22:02.550 回答
0

我猜你的测试数据库没有反映实际的模式。确保每次运行更改数据库的迁移时都更新了测试数据库。

rake db:test:prepare

此外,如果您正在运行 spork,请确保已将其停止并重新启动以重新加载所有内容。

于 2013-04-20T11:20:25.407 回答