2016-03-01 28 views
5

Học Rspec, chỉ làm việc với Ruby chứ không phải Rails. Tôi có một kịch bản hoạt động như mong đợi từ dòng lệnh, nhưng tôi không thể vượt qua bài kiểm tra.Hành vi rspec bất ngờ

Mã liên quan:

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

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

    def age! 
    @age += 1 
    end 

Và 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 

Và các lỗi:

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

     expected: 10 
      got: nil 

     (compared using ==) 

Tôi nghĩ rằng đó là tất cả các mã có liên quan, xin vui lòng cho tôi biết nếu tôi thiếu một cái gì đó trong mã tôi đăng. Từ những gì tôi có thể nói lỗi đến từ phạm vi trong rspec, và biến @age không được chuyển vào thử nghiệm rspec theo cách mà tôi nghĩ nó nên, vì vậy không phải khi cố gắng gọi hàm trong thử nghiệm.

Trả lời

5

@age là một biến trong mỗi đối tượng Tree của bạn. Bạn nói đúng rằng đây là một 'vấn đề' phạm vi, nhiều tính năng phạm vi hơn - kiểm tra của bạn không có biến có tên là @age.

Những gì nó có là một biến gọi là @tree. Điều đó Tree có một tài sản được gọi là age. Điều này sẽ hiệu quả, hãy cho tôi biết nếu không:

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

Xin cảm ơn, hoạt động như mong đợi. Vấn đề của tôi đã suy nghĩ rằng vì phương pháp này được gọi trong cùng một khối như rspec 'mong đợi' Ruby sẽ kỳ diệu hiểu những gì tôi đã hỏi. Tôi mới nhận ra rằng tôi đã có cùng một vấn đề vài tháng trước trong một bối cảnh khác - tôi sẽ nhớ lần sau. –

Các vấn đề liên quan