最近将代码库与宝石一起升级为rails4,现在我们遇到了这个错误。
Failure/Error: it { is_expected.to ensure_inclusion_of(:usage).in_array(['Index', 'Slide', 'Body']).with_message("%{value} is not a valid usage") }
["Index", "Slide", "Body"] doesn't match array in validation
这是相关的模型代码
USAGES = ['Index', 'Slide', 'Body']
validates_inclusion_of :usage, :in => USAGES, :message => "%{value} is not a valid usage"
我缺少什么吗?我不明白为什么这会失败。
validate_inclusion_of
内部使用 allow_value
。诚然,我们应该给您更好的错误消息,以了解这里发生的事情,但是您应该能够编写以下测试以弄清楚发生了什么:
it { should allow_value("Index").for(:usage) }
it { should allow_value("Slide").for(:usage) }
it { should allow_value("Body").for(:usage) }
it do
should_not allow_value("something else").
for(:usage).
with_message("%{value} is not a valid usage")
end
我的猜测是,应有的匹配者不会自动在失败消息内部插值%{value}
。如果这是真的,那么(提交问题后)将要做的是将消息提取到I18N密钥,然后将密钥的名称传递给with_message
。
为我工作 -
expect { should validate_inclusion_of(:usage).in?(['a', 'b']) }
应该尝试一下 -
validates :usage, inclusion: { :in => %w( Index Slide Body ), :message => "%{value} is not a valid usage" }