Rails&应用规范匹配器:validate_presence_of(:first_name)爆炸

时间:2015-09-19 01:40:56

标签: ruby-on-rails rspec shoulda

describe User do

  it { should belong_to(:shop) }


  it { should respond_to(:shop) }
  it { should respond_to (:first_name)}
  it { should respond_to (:last_name)}
  it { should respond_to (:email)}

工作正常。但是一旦我补充道:

it { should validate_presence_of (:first_name)}
it { should validate_presence_of (:last_name)}

它打破了,特别是在这个回调方法中:

def get_url
    source = "http://www.randomsite.com/"+ first_name + "+" + last_name
end
  

没有将nil隐式转换为+

的字符串

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

您的first_namelast_name似乎是nil进行测试。 尝试将before块中的值存根,如下所示:

context 'first_name and last_name validation' do
  before do
    allow(subject).to receive(:first_name).and_return('bob')
    allow(subject).to receive(:last_name).and_return('tom')
  end

  it { should validate_presence_of (:first_name)}
  it { should validate_presence_of (:last_name)}
end

答案 1 :(得分:0)

嗯,这就是validate_presence_of(:first_name)的工作原理:

  1. 它会为您的模型的nil属性分配first_name,并在您的模型上调用.valid?
  2. 如果.valid?返回true,则测试失败,因为如果您已经进行了正确的验证,那就不会发生。
  3. 我认为get_url方法设置为在before_validation回调上运行,因此您的代码中发生了什么:

    1. first_name被分配到nil
    2. .valid?被召唤。
    3. before_validation回调会触发您的get_url方法
    4. 一切都爆发了,因为get_url没有考虑first_name可以是nil