3

まず、有効なファクトリ/モデルがあり、この特定のテストはコンソールから正常に実行されます。

モデル

validate :some_condition

def some_condition
  errors.add(:attribute, "cannot be less than 5") if self.attribute < 5
end

テスト

it "should not allow values above 5" do
  model = FactoryGirl.create(:model) # creates valid model
  model.attribute = 10
  model.valid?.should be_false
end

コンソールで:

model = FactoryGirl.create(:model)
model.attribute = 10
model.valid? # => false

rspecで

undefined method `<' for nil:NilClass

なぜこれが起こっているのか理解できません。これは明らかに と関係がありますがself.attribute、コンソールでは機能するのに、テストでは機能しないのはなぜですか? attribute単独でも同じエラーが返されます。確認しました-selfはモデルインスタンスとして定義されています。とにかく、これは矛盾を説明していません。まったく同じモデルと属性でコンソールで動作します。

注: すべての環境を再起動しました。これは、新しいリロードに基づいています。

アップデート

絶望的な行為で、私はattributeこの条件の前にいくつかのコンテキストで出力し、その後exit. これにより、さらに奇妙な結果がもたらされました。これを解決してください:

def some_condition
  puts self.attribute # => returns blank in test, attribute value otherwise
  puts "#{self.attribute}" # => returns attribute value in test!!!
  exit

  errors.add(:attribute, "cannot be less than 5") if self.attribute < 5
end

上記は私を信じられないほど緊張させました。テストをテストするためにテストが必要ですか? 私は完全に迷っているので、ルビーや上記のツールの経験が豊富な人がこの混乱について論理的な説明をしてくれることを本当に願っています。

それはこの忌まわしきことにつながります:

errors.add(:attribute, "cannot be less than 5") if self.attribute < 5
# => IN TESTS self.attribute returns nil

errors.add(:attribute, "cannot be less than 5") if "#{self.attribute}".to_i < 5
# => IN TESTS self.attribute returns value! This works!?

どこを向いていますか?ruby、rails、factory girl、rspecですか?

修理

rake db:test:prepare質問のその大規模な難破の後、マイナーな移行の後に忘れていたことが判明しました。それがどうしてこのような問題を引き起こしたのか、私はまだ困惑しています。学んだ教訓。環境間で移行を実行し、より優れたデバッガーを見つけてください!

4

1 に答える 1

0

RSpec の構文はバージョン 1 から 2 で少し変更されているため、混乱する可能性があります。

このようにテストを書くとどうなるか教えていただけますか?

it "should not allow values above 5" do
  model = build(:model, :attribute => 10)
  model.should_not be_valid
  model.should have(1).error_on(:attribute)
end

私が使用している理由は、データベースにアクセスせbuildcreateに検証をテストできる方法です。

于 2013-01-29T00:37:49.207 に答える