Rails & Shoulda Spec Matcher: сбой validate_presence_of (:first_name)

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 в String для +

Как это исправить?


person Jackson Cunningham    schedule 19.09.2015    source источник


Ответы (2)


Похоже, ваши first_name и last_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
person K M Rakibul Islam    schedule 19.09.2015

Вот как работает validate_presence_of(:first_name):

  1. Он присваивает nil атрибуту first_name вашей модели и вызывает .valid? в вашей модели.
  2. Если .valid? возвращает true - тест завершается неудачей, поскольку, если бы у вас была правильная проверка, этого бы не произошло.

Я предполагаю, что метод get_url настроен для работы с before_validation обратным вызовом, поэтому что происходит в вашем коде:

  1. first_name назначается nil.
  2. .valid? называется.
  3. before_validation обратный вызов запускает ваш get_url метод
  4. Все рушится, потому что get_url не учитывает, что first_name может быть nil.
person Alexey Shein    schedule 21.09.2015