2014-02-18 94 views
0

所以我正在通過CodeSchool的Rspec track(我在4級),並且我喜歡重寫這些示例以加強我的正在學習。我設置了一個模仿殭屍類狗類,以及跑了相同的測試,但由於某些原因,我發現了錯誤:CodeSchool的Rspec示例給了我NoMethodError:'undefined method'+'for nil:NilClass'

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 

任何人都可以解釋爲什麼我得到NoM​​ethodError? 另外,我知道這個網站上的問題通常是學習實踐,但希望理解爲什麼我得到這個錯誤將幫助我在以後寫更多的實際測試。 謝謝。

+1

你還沒有在新記錄中初始化'iq',所以它的值是'nil',你嘗試增加它就是以這種方式失敗。 –

回答

0

iq必須有一個值,然後纔可以增加該值。所以你需要在自己之前做的是<% iq = 0 %> self.iq + = 3

相關問題