【问题标题】:Validate_presence_of test passing when it shouldn't?Validate_presence_of 测试在不应该通过的时候通过?
【发布时间】:2013-04-20 11:14:58
【问题描述】:

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

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

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

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

it { should validate_presence_of(:displayname) }

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

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

【问题讨论】:

    标签: ruby-on-rails rspec shoulda


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        rake db:test:prepare

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

        【讨论】:

        • 这并没有改变任何东西。有关更多详细信息,请参阅我的编辑,但它似乎只是忽略了我通过验证存在的布尔值,并且总是希望它在那里。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        相关资源
        最近更新 更多