Пример CodeSchool Rspec дает мне NoMethodError: 'неопределенный метод '+' для nil: NilClass'

Итак, я прохожу курс CodeSchool Rspec (у меня 4-й уровень) и мне нравится переписывать примеры, чтобы закрепить то, что я изучаю. Я настроил класс Dog, имитирующий класс Zombie, и провел идентичные тесты, но по какой-то причине получаю сообщение об ошибке:

1) Dog is a genius dog
   Failure/Error: before { dog.learn_trick }
   NoMethodError:
     undefined method `+' for nil:NilClass
   # ./app/models/dog.rb:19:in `learn_trick'
   # ./spec/models/dog_spec.rb:23:in `block (2 levels) in <top (required)>'

2) Dog is not a dummy dog
   Failure/Error: before { dog.learn_trick }
   NoMethodError:
     undefined method `+' for nil:NilClass
   # ./app/models/dog.rb:19:in `learn_trick'
   # ./spec/models/dog_spec.rb:23:in `block (2 levels) in <top (required)>'

Я не понимаю, почему, вот код:

Модель CodeSchool:

class Zombie < ActiveRecord::Base
  attr_accessible :name
  validates :name, presence: true

  def eat_brains
    self.iq += 3
  end

  def dummy?
    iq < 3
  end

  def genius?
    iq >= 3
  end
end

Моя модель

class Dog < ActiveRecord::Base
  validates :name, presence: true

  def learn_trick
    self.iq += 3
  end

  def genius?
    iq >= 3
  end

  def dummy? 
    iq < 3
  end
end

Примечание. Я не использую attr_accessible, потому что использую Rails4.

Спецификации CodeSchool

describe Zombie do
  let(:zombie) { Zombie.new }
  subject { zombie }

  before { zombie.eat_brains }

  it 'is not a dummy zombie' do
    zombie.should_not be_dummy
  end

  it 'is a genius zombie' do
    zombie.should be_genius
  end
end

Мои характеристики

describe Dog do
  let(:dog) { Dog.new }
  subject { dog }

  before { dog.learn_trick }

  it "is not a dummy dog" do
    dog.should_not be_dummy
  end 

  it "is a genius dog" do
    dog.should be_genius
  end 
end

Кто-нибудь может объяснить, почему я получаю NoMethodError? Кроме того, я знаю, что вопросы на этом сайте обычно носят практический характер, но, надеюсь, понимание того, почему я получаю эту ошибку, поможет мне позже написать более практические тесты. Спасибо.


person Joe Susnick    schedule 18.02.2014    source источник
comment
Вы не инициализировали iq в новой записи, поэтому его значение равно nil, и ваша попытка увеличить его таким образом терпит неудачу.   -  person Peter Alfvin    schedule 18.02.2014


Ответы (1)


iq должен иметь значение, прежде чем вы сможете увеличить его. Итак, вам нужно сделать <% iq = 0 %> перед self.iq += 3

person HackerKarma    schedule 18.02.2014