2017-10-19 4 views
0

나는 시험 (RSpec에) 널 (null)와 모델과 혼란 스러워요RSpec에 테스트 모델 : 일부 속성에 거짓 : 거짓 제약

그 속성 = 전무 중 하나를 새 인스턴스로 새로운 인스턴스를 생성. 유효한? 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를 사용하면 raiseNerror가 NotNullViolation이 발생하기 전에 응답하지 않습니다. – romss182

답변