2012-03-29 12 views
1

デバッグしようとしているテストがあり、値がユーザー属性に適切に設定されていないことに気付きました。 p user.height_feetまたはp user.height_inchesをデバッグコンソールから実行すると、nilが返されます。代わりに、最初の繰り返しでそれぞれ18が返されると思います。しかし、p invalid_height.firstおよびp invalid_height.secondは、1および8を正しく返します。ここでRSpec - ユーザー属性に適切に設定されていない値

はコードです:

describe "when height is invalid" do 
    invalid_height = [[1, 8], [8, 2], [5, 13], ['text', 'text'], ['text', 11], [5, 'text'], ['', '']] 
    invalid_height.each do |invalid_height| 
    before do 
     user.height_feet = invalid_height.first 
     user.height_inches = invalid_height.second 
    end 

    it "should not be valid" do 
     debugger 
     user.should_not be_valid 
    end 
    end 
end 

とデバッグ端子の出力:#rubyonrails IRCチャンネルで

(rdb:1) p user.height_feet 
nil 
(rdb:1) p user.height_inches 
nil 
(rdb:1) p invalid_height.first 
1 
(rdb:1) p invalid_height.second 
8 

誰かが、それはスコープの問題であることが示唆され、どこで私の求めて私のbeforeブロックとitブロックが異なるユーザーを参照している可能性があると、ユーザーが定義されています。同じ仕様ファイルで、beforeitの両方のブロックがうまく動作するテストがあるので、これは問題になるとは思わなかった。思考?

答えて

2

あなたのコードが何をしているのか考える必要があります。

それぞれを通り、beforeit "should not be valid" が作成されますが、これらはすべて同じスコープ内で評価されます。

だから、だからあなたのすべてのテストの結果だけで基本的に

before do 
    user.height_feet = "" 
    user.height_inches = "" 
end 

it "should not be valid" do 
    debugger 
    user.should_not be_valid 
end 
であるあなたが beforeブロック

before do 
    user.height_feet = 1 
    user.height_inches = 8 
end 

before do 
    user.height_feet = 8 
    user.height_inches = 2 
end 

... 

before do 
    user.height_feet = "" 
    user.height_inches = "" 
end 

の負荷を作成し、itブロック

it "should not be valid" do 
    debugger 
    user.should_not be_valid 
end 

it "should not be valid" do 
    debugger 
    user.should_not be_valid 
end 

... 

it "should not be valid" do 
    debugger 
    user.should_not be_valid 
end 

の負荷を作成します

あなたの意図ではないと私は信じています。

明白な修正点は、ブロックcontextを使用することです。これにより、ステートメントの各ペアがコンテキストにシールされます。

[[1, 8], [8, 2], [5, 13], ['text', 'text'], ['text', 11], [5, 'text'], ['', ''] 
].each do |feet, inches| 
    context "with an invalid height of #{feet} feet, #{inches} inches" do 

    before do 
     user.height_feet = feet 
     user.height_inches = inches 
    end 

    it "should not be valid" do 
     debugger 
     user.should_not be_valid 
    end 
    end 
end 
+1

ありがとうございます!非常に有益。私はRubyを初めて使っているので、 'context'ブロックに慣れていませんが、もっと詳しく知るために調べます。 – Nick

関連する問題