Ruby on rails 使用shoulda匹配器检查枚举值时出错
在我的Ruby on rails 使用shoulda匹配器检查枚举值时出错,ruby-on-rails,rspec,shoulda,Ruby On Rails,Rspec,Shoulda,在我的设备型号中,我有 enum device_type: { ios: 1 , android: 2 } validates :device_type, presence: true, inclusion: { in: device_types.keys } 在我的设备规范rb中,我编写了一些类似的测试 describe 'validations' do subject { FactoryGirl.build(:device) } it { is_expected.to allow
设备
型号中,我有
enum device_type: { ios: 1 , android: 2 }
validates :device_type, presence: true, inclusion: { in: device_types.keys }
在我的设备规范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”]中包含设备类型
失败/错误:它{应为。验证(:设备类型).in_数组(%w(ios android))}
2) 设备不应允许将设备类型设置为“windows”
失败/错误:它{应为\但不允许\值('windows')。对于(:设备\类型)}
“它不是有效的设备类型”是正确的,但为什么这些测试失败?当您将属性定义为enum时,您可以使用Shoulda matchers进行测试
it { should define_enum_for(:device_type).with(:ios, :android) }
如果尝试分配任何其他值,ActiveRecord将引发ArgumentError(不是有效的设备类型)
:
我感觉你遗漏了部分规格。从错误消息中可以看出您正在尝试创建!类型为“123456789”的设备。您应该尝试在不使用的情况下使用create!或者使用build和expect device.valid?为eq false,我添加了工厂零件。我完全使用build。“123456789”不包括在我的工厂中,它来自于我不确定预期的语法。我只想将测试写成:shoulda matchers将
device\u type
视为一个fixnum值(实际上,它是一个以db为单位的整数)。还没有找到解决办法。查看源代码:更多信息,但这里没有真正的解决方案:
ArgumentError:
'windows' is not a valid device_type
it { should define_enum_for(:device_type).with(:ios, :android) }
it { should define_enum_for(:device_type).with_values([:ios, :android]) }