2016-03-01 15 views
5

Apprendimento Rspec, funzionante con solo Ruby, non Rails. Ho uno script che funziona come previsto dalla riga di comando, ma non riesco a far passare il test.Comportamento rspec inatteso

Il codice rilevante:

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

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

    def age! 
    @age += 1 
    end 

E la specifica:

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 

E l'errore:

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

     expected: 10 
      got: nil 

     (compared using ==) 

penso che è tutto il codice relativo, per favore fatemelo sapere se mi manca qualcosa nel codice che ho postato. Da quello che posso dire l'errore viene dall'ambito di scope all'interno di rspec, e la variabile @age non viene passata nel test rspec in un modo che penso che dovrebbe, risultando quindi nullo quando si tenta di chiamare la funzione all'interno del test.

risposta

5

@age è una variabile all'interno di ciascuno degli oggetti Tree. Hai ragione che si tratta di un "problema" dell'oscilloscopio, più una funzionalità dell'ambito: il test non ha una variabile denominata @age.

Ciò che ha è una variabile denominata @tree. Che Tree ha una proprietà denominata age. Questo dovrebbe funzionare, fammi sapere se non lo fa:

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

Grazie, funziona come previsto. Il mio problema era pensare che dal momento che il metodo veniva chiamato nello stesso blocco di rspec "aspetta" Ruby avrebbe magicamente capito cosa stavo chiedendo. Mi sono appena reso conto che ho avuto lo stesso problema mesi fa in un contesto diverso - ricorderò la prossima volta. –

Problemi correlati