虚拟属性中的Nil值未被Rails验证捕获?

时间:2017-03-30 15:18:37

标签: ruby-on-rails ruby validation rspec

我有这个Rails模型:

class Profile < ActiveRecord::Base

  validates :number_format, :inclusion => { :in => ["1,000.00", "1.000,00"] }

  def number_format=(format)
    self.currency_delimiter = format[1]
    self.currency_separator = format[5]
  end

  def number_format
    "1#{currency_delimiter}000#{currency_separator}00"
  end

end

问题在于,当我用RSpec测试时......

it "is invalid without a number_format" do
  expect(FactoryGirl.build(:profile, :number_format => nil).errors_on(:number_format).size).to eq(1)
end

...我收到此错误:

  

1)没有number_format,配置文件number_format无效        失败/错误:期望(FactoryGirl.build(:profile,:number_format =&gt; nil).errors_on(:number_format).size).to eq(1)

   expected: 1
        got: 0

这怎么可能?

由于我采用的验证方法,我认为nil无法验证。

2 个答案:

答案 0 :(得分:1)

FactoryGirl.build只是初始化一条记录,它不会尝试将记录保存到数据库中,因此不会在记录上调用valid?。如果不调用valid?,实例错误将始终为空。

请改为尝试:

it "is invalid without a number_format" do
  profile = FactoryGirl.build(:profile, :number_format => nil)

  expect(profile).to_not be_valid # `be_valid` actually calls `valid?`
  expect(profile.errors_on(:number_format).size).to eq(1)
end

答案 1 :(得分:0)

如果您使用的是虚拟属性,我认为错误会保存到:base。您应该检查expect(FactoryGirl.build(:profile, :number_format => nil).errors.size).to eq(1)