【发布时间】: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_type2) 设备不应允许将 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