Je suis confondu avec le test (Rspec) un modèle avec null: false sur certains attributs:modèle de test Rspec avec null: false contrainte
Lors de la création d'une nouvelle instance avec un de ces attribut = nul, la nouvelle instance. valide? renvoie true mais si j'essaie de le sauvegarder, il renvoie des messages d'erreur sur ActiveRecord :: NotNullViolation. Je comprends qu'il passe les 'validations de modèles' mais échoue dans 'Validations de base de données'. Quelle est la bonne façon de tester mon modèle alors?
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)>'
Votre hypothèse est juste, vous pouvez tester qu'elle soulève ladite exception. En fin de compte, vous voulez ajouter une validation à votre modèle, de sorte qu'il échoue à la validation et que save renvoie false, plutôt que de déclencher une exception de base de données. – Leito
Merci Leito. En utilisant FactoryGirl.build, il ne déclenche aucune erreur car il ne gère pas le DB (je suppose). En utilisant FactoryGirl.create le raise_error n'est pas répondu comme le NotNullViolation déclenche avant. – romss182