2016-03-01 13 views
5

Rspecを学習すると、RailsではなくRubyだけで作業します。私はコマンドラインから期待どおりに動作するスクリプトを持っていますが、テストをパスすることはできません。予期せぬ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テストに渡されていないと考えられます。テスト内で関数を呼び出そうとするとnilになります。

答えて

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は魔法のように私が求めていることを理解するだろうと考えていました。私は数ヶ月前に別の文脈で同じ問題を抱えていたことを認識しました。次回は覚えています。 –

関連する問題