2016-03-01 81 views
5

學習Rspec,只使用Ruby而不使用Rails。我有一個從命令行按預期工作的腳本,但我無法通過測試。意外的rspec行爲

相關的代碼:

class Tree  
    attr_accessor :height, :age, :apples, :alive 

    def initialize 
    @height = 2 
    @age = 0 
    @apples = false 
    @alive = true 
    end  

    def age! 
    @age += 1 
    end 

而且規格:

describe "Tree" do 

    before :each do 
    @tree = Tree.new 
    end 

    describe "#age!" do 
    it "ages the tree object one year per call" do 
     10.times { @tree.age! } 
     expect(@age).to eq(10) 
    end 
    end 
end 

和錯誤:

1) Tree #age! ages the tree object one year per call 
    Failure/Error: expect(@age).to eq(10) 

     expected: 10 
      got: nil 

     (compared using ==) 

我認爲這是所有相關的代碼,請讓我知道如果我在我發佈的代碼中丟失了某些內容。從我可以告訴錯誤來自rspec內的範圍,並且@age變量沒有以我認爲應該的方式傳遞給rspec測試,因此在嘗試調用測試內的函數時爲零。

回答

5

@age是您的每個Tree對象中的變量。你是對的,這是一個範圍問題,更多的是範圍特徵 - 你的測試沒有名爲@age的變量。

它所具有的是一個名爲@tree的變量。該Tree有一個名爲age的屬性。這應該工作,讓我知道,如果它不:

describe "Tree" do 

    before :each do 
    @tree = Tree.new 
    end 

    describe "#age!" do 
    it "ages the tree object one year per call" do 
     10.times { @tree.age! } 
     expect(@tree.age).to eq(10) # <-- Change @age to @tree.age 
    end 
    end 
end 
+0

謝謝,按預期工作。我的問題在於,由於該方法在rspec'expect'的同一個塊中被調用,Ruby會奇蹟般地理解我在問什麼。我剛剛意識到我在幾個月前在不同的環境中遇到了同樣的問題 - 我將在下一次回憶。 –