1

デバッグしようとしているテストがあり、値がユーザー属性に正しく設定されていないことに気付きました。実行するとき、p user.height_feetまたはp user.height_inchesデバッグコンソールから実行すると、が返されます。代わりに、最初の反復でそれぞれがnil返されることを期待しています。しかし、適切に戻ってください。18p invalid_height.firstp invalid_height.second18

コードは次のとおりです。

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

そして、デバッグ端末での出力:

(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

#rubyonrails IRCチャネルの誰かが、スコープの問題である可能性があることを示唆し、私のユーザーbeforeitブロックが異なるユーザーを参照している可能性があると言って、ユーザーがどこで定義されているかを尋ねました。before同じスペックファイルに他のテストがあり、両方とitブロックが正常に実行されているため、これが問題になるとは思いませんでした。考え?

4

1 に答える 1

2

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

それぞれを通過してabeforeとanを作成しますit "should not be valid" が、これらはすべて同じスコープで評価されます。

だからあなたは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

したがって、すべてのテストの結果は基本的には

before do
  user.height_feet = ""
  user.height_inches = ""
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
于 2012-03-29T03:39:11.123 に答える