まず、有効なファクトリ/モデルがあり、この特定のテストはコンソールから正常に実行されます。
モデル
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
質問のその大規模な難破の後、マイナーな移行の後に忘れていたことが判明しました。それがどうしてこのような問題を引き起こしたのか、私はまだ困惑しています。学んだ教訓。環境間で移行を実行し、より優れたデバッガーを見つけてください!