3

rspec テストが失敗する理由を突き止めようとしています。最も注目すべきは、矛盾しているように見える失敗メッセージです。私は ActiveRecord::RecordInvalid エラーがあり、それはまさに私が主張していることです。

これが私のuser.rbです

...
validates_presence_of :email
...

ここに私のusers_spec.rbがあります

...
it "is invalid without email" do 
  Factory(:user, email: nil).should raise_error(ActiveRecord::RecordInvalid)
end
...

出力は次のとおりです。

Failures:

  1) User a user (in general) is invalid without email
     Failure/Error: Factory(:user, email: nil).should raise_error(ActiveRecord::RecordInvalid)
     ActiveRecord::RecordInvalid:
       Validation failed: Email is invalid, Email can't be blank
     # ./spec/models/user_spec.rb:34:in `block (3 levels) in <top (required)>'

もともと私はこの方法でテストしていましたが、失敗し続けたので、予想されるエラーを特定することにしました。

it "is invalid without email" do 
  Factory(:user, email: nil).should_not be_valid
end
4

1 に答える 1

8

コードが機能しない理由は、実際に有効性をテストする前に、無効なモデルを作成しようとしているからです。やりたいことは、次のように、有効なモデルを作成し、何かを変更して、それが無効であることを確認することです。

it "is invalid without email" do 
  user = Factory(:user)
  user.email = nil
  user.should_not be_valid
end

私は個人的に、モデルをbeforeブロックで定義するのが好きです。次のように設定してsubjectから、各仕様の属性を変更し、有効性を確認します。

before do
  @user = FactoryGirl.create(:user)
end

subject { @user }

it "is invalid without email" do
  subject.email = nil
  should_not be_valid
end

レコードについては、レコードの作成でエラーが発生したことをテストしたい場合 (これは間違いなくFactory推奨される方法ではありません)、次のように呼び出しを でラップすることで実行できますlambda

lambda {
    Factory(:user, :email => nil)
}.should raise_error(ActiveRecord::RecordInvalid)
于 2012-08-07T22:19:41.423 に答える