2017-10-19 17 views
0

私はテスト(RSPEC)はnullを持つモデルと混乱しています。これらの属性= nilのの一つ、新しいインスタンスに新しいインスタンスを作成するときRSpecのテストモデル:偽制約

:いくつかの属性にはfalse。有効ですか? trueを返しますが、保存しようとすると、ActiveRecord :: NotNullViolationにエラーメッセージが返されます。私はそれが 'モデルバリデーション'に合格したと理解していますが、 'データベース検証'で失敗します。 モデルをテストする正しい方法は何ですか?

RSpec.describe BusinessSetting, type: :model do 
    # before :each do 
    # @business_setting = FactoryGirl.create(:business_setting) 
    # end 

    it "has a valid factory" do 
    expect(FactoryGirl.create(:business_setting)).to be_valid 
    end 

    it "is invalid without a business_id" do 
    expect(FactoryGirl.create(:business_setting, business_id: 
nil)).not_to be_valid 
    end 

    it "is invalid without a bot_token" do 
    expect(FactoryGirl.build(:business_setting, bot_token: nil)).to 
raise_error 
    end 
end 

Failures: 

    1) BusinessSetting is invalid without a business_id 

Failure/Error: expect(FactoryGirl.create(:business_setting, business_id: nil)).to raise_error 

ActiveRecord::NotNullViolation: 
    Mysql2::Error: Field 'business_id' doesn't have a default value: INSERT INTO `business_settings` (`bot_token`, `employee_user_id`, `created_at`, `updated_at`, `bill_regex`, `email`, `store_code`, `name`, `description`) VALUES ('516dbe4b-9a54-47e7-be7f-9110703589e6', 25899, '2017-10-19 17:42:18', '2017-10-19 17:42:18', '^F947\\d{7}$', '[email protected]', '947', 'Nom du magasin', 'Description du magasin') 
# ./spec/models/business_setting_spec.rb:14:in `block (2 levels) in <top (required)>' 
# ------------------ 
# --- Caused by: --- 
# Mysql2::Error: 
# Field 'business_id' doesn't have a default value 
# ./spec/models/business_setting_spec.rb:14:in `block (2 levels) in <top (required)>' 

    2) BusinessSetting is invalid without a bot_token 

Failure/Error: expect(FactoryGirl.build(:business_setting, bot_token: nil)).to raise_error 
     expected Exception but was not given a block 
# ./spec/models/business_setting_spec.rb:18:in `block (2 levels) in <top (required)>' 
+1

、あなたはそれが例外言っ上げることをテストできます。最終的には、モデルに検証を追加して、検証に失敗し、DB例外を発生させるのではなく、falseが返されます。 – Leito

+0

ありがとうLeito。 FactoryGirl.buildを使用すると、dbを処理しないのでエラーは発生しません(私は推測します)。 FactoryGirl.createを使用すると、NotNullViolationが発生する前にraise_errorに応答しません。 – romss182

答えて

1

expect to raise_errorは{}で使用する必要がありますあなたの仮定が正しいと

expect{FactoryGirl.create(:business_setting, business_id: nil)}.to raise_error 
+0

驚くばかりの男Yogev! – romss182