Итак, я прохожу курс 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? Кроме того, я знаю, что вопросы на этом сайте обычно носят практический характер, но, надеюсь, понимание того, почему я получаю эту ошибку, поможет мне позже написать более практические тесты. Спасибо.
iq
в новой записи, поэтому его значение равноnil
, и ваша попытка увеличить его таким образом терпит неудачу. - person Peter Alfvin   schedule 18.02.2014