Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用shoulda匹配器检查枚举值时出错_Ruby On Rails_Rspec_Shoulda - Fatal编程技术网

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]) }