2016-04-22 9 views
0

CookbookモデルのRSpecでモデルテストを書いています。各ユーザはhas_many料理本、各料理本はbelongs_toユーザ。 Cookbookは、ユーザーせずに作成することができなかったことを確認するために、私は次のテストを書いた:Rails RSpecテストが正しく合格しない

it "is invalid without a user" do 
    expect(FactoryGirl.build(:cookbook, user: nil)).to be_invalid 
end 

rspecを実行している場合しかし、私は次の出力を得る:だから、その後、

1) Cookbook is invalid without a user 
    Failure/Error: expect(FactoryGirl.build(:cookbook, user: nil)).to be_invalid 
    NoMethodError: 
    undefined method `cookbooks' for nil:NilClass 

を、

it "is invalid without a user" do 
    expect{FactoryGirl.build(:cookbook, user: nil)}.to raise_error(NoMethodError) 
end 

しかし、そのテストは、以下の出力で失敗します:提起されているエラーをテストするために、私はこのようなテストが行​​われ

1) Cookbook is invalid without a user 
    Failure/Error: expect{FactoryGirl.build(:cookbook, user: nil)}.to raise_error(NoMethodError) 
    expected NoMethodError but nothing was raised 

それが何を意味している場合、ここでの料理のための工場です:Cookbookを作成するとき、それは必ず、ユーザが必要とされますように

require 'faker' 

FactoryGirl.define do 
    factory :cookbook do |f| 
    f.title "#{Faker::Name.first_name}'s recipes" 
    f.description "#{Faker::Name.last_name}'s favorite recipes." 
    f.user 1 
    end 
end 

にはどうすればモデルのテストを書くことについては行くべき?

+0

クックブッククラスを投稿してください –

答えて

3

モデル内には、ユーザーモデル上でbookshelvesを呼び出すいくつかの検証またはコールバック前の呼び出しがあるかもしれません。テストでbe_invalidを呼び出すと、RSpecはFactoryGirlを介して構築されたオブジェクトのvalid?を呼び出します。オブジェクトが妥当性検査を実行し、nilオブジェクト(ユーザー)上でbookshelvesを呼び出すため、エラーが発生します。

エラーが発生したことをテストすると、valid?がオブジェクトに対して呼び出されなかったために発生しません。あなたがこの方法を行う場合はこのように、あなたのテストでエラーが発生します:

it "is invalid without a user" do 
    expect{FactoryGirl.build(:cookbook, user: nil).valid?}.to raise_error(NoMethodError) 
end 

私はそれが通過するために、あなたのテストにその変更を加えることをお勧めしませんが。 bookshelvesを呼び出す前に、モデルにアクセスしてユーザーがいるかどうかを確認する必要があります。そうしないと、ユーザーなしでCookbookを作成しようとすると、アプリが壊れます。

関連する問題