2016-03-01 2 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 «ожидать», Ruby волшебным образом понял бы то, что я просил. Я просто понял, что у меня была одна и та же проблема несколько месяцев назад в другом контексте - я буду помнить в следующий раз. –

Смежные вопросы