【问题标题】:Shoulda-matchers throwing confusing errors应该匹配器抛出令人困惑的错误
【发布时间】:2015-03-15 16:56:16
【问题描述】:

在将 shoulda-matchers gem 从 v1.4.2 更新到 v2.7.0 后,我遇到了问题,并且失败取决于我运行测试的方式。当我“正常”运行当前的测试套件时,我会遇到这样的失败:

失败/错误:它{应该 validate_presence_of :attribute1}

当primary_first_name设置为nil时,预期的错误包括“不能为空”,得到错误:[“不能为空(属性:\”属性2\”,值:无)”,“不能为空(属性:\"attribute3\",值:nil)"]

发生这种情况时,我尝试设置 Spring,然后设置 Zeus 来加快测试速度(我们使用的是 Spring Rails 3.2.18 之前的版本),这两者都改变​​了错误输出。上述形式的错误消失了,但这种形式取代了它:

失败/错误:它 {should validate_presence_of :attribute}

无方法错误: #RSpec::ExampleGroups::(Model instance)> 的未定义方法 `validate_presence_of'>(删除左尖括号以使其显示在此处)

我还发现一堆其他测试开始失败,出现这种错误:

失败/错误:它 {should have_db_column :column_name} 预期 # 响应has_db_column?

我找到了一个报告discussing后一个问题,但是好像是shous-matchers/Spring冲突,所以我不知道为什么宙斯会导致同样的问题。

我不知道第一个问题是潜在的还是加剧了第二个问题。这三个 gem 对我来说都是新的(我正在处理遗留代码),所以我的后备修复将是摆脱 shoulda-matchers (我更新它作为对它似乎引起的另一个问题的响应)并重写依赖它的测试。有没有更温和的选择?

【问题讨论】:

    标签: ruby ruby-on-rails-3 shoulda


    【解决方案1】:

    其中一部分可能是您的测试设置中的错误(在规范中)以及模型是如何构建以通过测试的。模型应该有一个validates 组件,它响应测试。

    让我们来看看你的这部分错误:

    失败/错误:它{应该 validate_presence_of :attribute1}

    primary_first_name 设置为 nil 时包含“不能为空”的预期错误,...

    这告诉我你在规范中创建了一个关于 attribute1 存在的应该验证,然后你需要在 presence 的模型中验证 attribute1

    那么您收到的内容有错误:

    得到错误:[“不能为空(属性:\”attribute2\”,值:nil)”,“不能为空(属性:\”attribute3\”,值:nil)”]

    多个错误,对于在哈希中传递的属性,当它只需要 1 个属性时。

    在不知道您的规格和型号的情况下,我只能假设,但我会这样写:

    规格:

    it { is_expected_to validate_presence_of(:attribute1) }
    

    然后,您的模型将具有对应的验证,以匹配它:

    validates :attribute1, presence: true
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-02
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多