【问题标题】:Error when checking enum value with shoulda-matchers使用 shoulda-matchers 检查枚举值时出错
【发布时间】:2015-12-28 15:13:07
【问题描述】:

在我的device 模型中,我有

enum device_type: { ios: 1 , android: 2 }
validates :device_type, presence: true, inclusion: { in: device_types.keys }

在我的device_spec.rb 中,我为此编写了一些测试

describe 'validations' do
  subject { FactoryGirl.build(:device) }

  it { is_expected.to allow_values('ios', 'android').for(:device_type) }
  it { is_expected.to validate_inclusion_of(:device_type).in_array(%w(ios android)) }
  it { is_expected.not_to allow_value('windows').for(:device_type) }
end

当我运行rspec时,测试allow_values('ios', 'android')通过了,但是剩下的两个都失败了。

1) 设备应确保在 ["ios", "android"] 中包含 device_type

失败/错误:它 { is_expected.to validate_inclusion_of(:device_type).in_array(%w(ios android)) }

 ArgumentError:
   '123456789' is not a valid device_type

2) 设备不应允许将 device_type 设置为“windows”

失败/错误:它 { is_expected.not_to allow_value('windows').for(:device_type) }

 ArgumentError:
   'windows' is not a valid device_type

“这不是有效的设备类型”是正确的,但为什么这些测试失败了?

【问题讨论】:

  • 我感觉您遗漏了部分规范。它从您尝试创建的错误消息中查找!类型为“123456789”的设备。您应该尝试使用不带 !或使用构建并期望 device.valid?等于假。
  • 我添加了工厂部分。我完全使用构建。并且我的工厂不包含'123456789',它来自shoulder-matchers
  • 我不确定 is_expected 语法。我会把测试写成:
  • shouda-matchers 将device_type 视为一个固定值(实际上,它是 db 中的整数)。还没有找到解决方法。查看源代码:github.com/thoughtbot/shoulda-matchers/blob/…
  • 更多信息,但这里没有真正的解决方案:stackoverflow.com/questions/29780121/…

标签: ruby-on-rails rspec shoulda


【解决方案1】:

当您将属性定义为枚举时,您可以使用 Shoulda 匹配器进行测试

it { should define_enum_for(:device_type).with(:ios, :android) }

如果您尝试分配任何其他值,ActiveRecord 将引发 ArgumentError(不是有效的 device_type)。

More recent shoulda syntax:

it { should define_enum_for(:device_type).with_values([:ios, :android]) }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多