2016-03-01 19 views
5

Nauka Rspec, praca z Ruby, a nie z Railsami. Mam skrypt, który działa zgodnie z oczekiwaniami z wiersza poleceń, ale nie mogę przejść testu.Nieoczekiwane zachowanie rspec

Odpowiedni kod:

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

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

    def age! 
    @age += 1 
    end 

A spec:

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 

i błąd:

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

     expected: 10 
      got: nil 

     (compared using ==) 

myślę, że wszystko jest odpowiedni kod, proszę dać mi znać jeśli brakuje mi czegoś w kodzie, który napisałem. Z tego, co mogę powiedzieć, wynika, że ​​błąd pochodzi z zasięgu w rspec, a zmienna @age nie jest przekazywana do testu rspec w sposób, który moim zdaniem powinien, a zatem jest zerowy, gdy próbuje wywołać funkcję w teście.

Odpowiedz

5

@age to zmienna wewnątrz każdego z obiektów Tree. Masz rację, że jest to "problem" określający zakres, a więcej funkcji scoping - Twój test nie ma zmiennej o nazwie @age.

To, co ma, to zmienna o nazwie @tree. Ta Tree ma właściwość o nazwie age. To powinno działać, daj mi znać, jeśli nie:

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

Dzięki, działa zgodnie z oczekiwaniami. Mój problem polegał na tym, że skoro metoda została wywołana w tym samym bloku, co rspec "oczekuj", Ruby magicznie zrozumiałaby to, o co prosiłem. Właśnie zdałem sobie sprawę, że miałem ten sam problem kilka miesięcy temu w innym kontekście - będę pamiętać następnym razem. –

Powiązane problemy