2016-04-22 84 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 

如果這意味着什麼,這裏是工廠的食譜:

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 

我應該如何去寫的模型試驗,以便它可以確保用戶需要創建Cookbook什麼時候?

+0

請發佈您的Cookbook課程 –

回答

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,您的應用就會中斷。