[RUBY] [Code de test unitaire] Même s'il existe une clé externe, elle indique "Veuillez saisir XX"

problème

J'ai fait un test appelé "quand les commentaires peuvent être sauvegardés" avec le code de test unitaire. À cette époque, les clés externes créées par FactoryBot, skill_id et user_id, existaient, mais pour une raison quelconque, elles étaient dites vides.

Déclaration d'erreur


  1)Publication de commentaires Lorsque la publication de commentaires est réussie Vous pouvez vous inscrire s'il y a un commentaire
     Failure/Error: expect(@comment).to be_valid
       expected #<Comment id: nil, text: "v5tycc16e03hixch09y3661diocp6t5mwqj11r26gbjnptc0ty...", skill_id: 2, user_id: 1, created_at: nil, updated_at: nil> to be valid, but got errors:Veuillez saisir l'utilisateur,Veuillez saisir la compétence
     # ./spec/models/comment_spec.rb:11:in `block (4 levels) in <top (required)>'

Finished in 0.78208 seconds (files took 6.7 seconds to load)
3 examples, 1 failure

Conclusion

Lors de la vérification de la validation de la clé externe, la valeur est obtenue en accédant à la base de données avec create au lieu de build. Apparemment, skill_id et user_id existaient, mais en raison de la contrainte de clé externe dans le fichier de migration, ces valeurs ont dû être extraites d'une autre table.

Construction

image.png

before

factorybot


FactoryBot.define do
  factory :comment do
    text { Faker::Lorem.characters(number: 100) }
    user_id { 1 }
    skill_id { 2 }
  end
end

comment_spec.rb


require 'rails_helper'
RSpec.describe Comment, type: :model do
  describe 'Poste un commentaire' do
  before do
    @comment = FactoryBot.build(:comment)
  end

    context 'Quand la publication de commentaires se passe bien' do
      it 'Vous pouvez vous inscrire s'il y a un commentaire' do
        expect(@comment).to be_valid
      end
    end
...

after

factorybot


FactoryBot.define do
  factory :comment do
    text { Faker::Lorem.characters(number: 100) }
    association :user
    association :skill
  end
end

comment_spec.rb


require 'rails_helper'
RSpec.describe Comment, type: :model do
  describe 'Poste un commentaire' do
  before do
    @comment = FactoryBot.create(:comment)
  end

    context 'Quand la publication de commentaires se passe bien' do
      it 'Vous pouvez vous inscrire s'il y a un commentaire' do
        expect(@comment).to be_valid
      end
    end
...

Recommended Posts

[Code de test unitaire] Même s'il existe une clé externe, elle indique "Veuillez saisir XX"
J'ai un ActionController :: MissingExactTemplate même si j'ai un fichier
Je veux écrire un test unitaire!
J'obtiens une javax.mail.AuthenticationFailedException même si je ne me suis pas authentifié.