应该validate_inclusion_of不起作用



最近将代码库与宝石一起升级为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" }

相关内容

最新更新