12

rspec および rspec-rails 2.11.0 で不可解な動作が発生しています。2.7.1を実行している同僚のアプリで動作を再現しました(両方ともruby 1.9.3で)

これらのテストは期待どおりに機能します (失敗します)。

it "should not change i" do
    i = 0
    expect {
      i = 2
    }.not_to change { i }
end

it "should not change i" do
    i = 0
    expect {
      i = 2
    }.not_to change { i }.from( 0 )
end

どちらの場合も、失敗メッセージは「結果は変更されるべきではありませんが、0 から 2 に変更されました」です。

期待値の "from" を別の値に変更すると、expect ブロックの i の値に何が起こっても失敗するのではなく、不可解に合格になります。

it "should not change i" do
    i = 0
    expect {
        i = 2
    }.not_to change { i }.from( 1 )
end

私は最近 1.9.3 にアップグレードしたばかりですが、この動作を経験していれば、以前にこの動作に気付いていたと確信を持って言えます。誰かがこれおよび/または私が間違っていることを説明できますか?

4

1 に答える 1

10

私はそれがあなたが期待するものとはまったく違うと思いますが、テストが書かれている方法はこれを実際に明らかにしていません. 1 として定義されていないため、最後の値は失敗します。

これを明らかにするための主なステップは、テストを逆にすることです。

describe "stuff" do

  it "should not change i" do
      i = 0
      expect {
        i = 2
      }.to change { i }
  end

  it "should not change i" do
      i = 0
      expect {
        i = 2
      }.to change { i }.from( 0 )
  end


  it "should not change i" do
      i = 0
      expect {
          i = 2
      }.to change { i }.from( 1 )
  end

end

これにより、最初の 2 つのテストは成功し、最後のテストはエラーで失敗します。result should have initially been 1, but was 0

したがって、問題のテストをそのまま行うi should not change from 1と、i は決して 1 ではないため、このテストは決して失敗しません。

it "should not change i" do
    i = 0
    expect {
        i = 2
    }.not_to change { i }.from( 1 ) # i goes from 0 to 2, not 1 to 2, so the test is valid
end
于 2012-10-02T19:48:00.197 に答える