[RUBY] [Unit Test Code] Obwohl es einen externen Schlüssel gibt, wird "Bitte geben Sie XX ein" gesagt

Problem

Ich habe einen Test namens "Wenn Kommentare gespeichert werden können" mit dem Unit-Test-Code durchgeführt. Zu diesem Zeitpunkt existierten die von FactoryBot erstellten externen Schlüssel Skill_id und User_id, die jedoch aus irgendeinem Grund als leer bezeichnet wurden.

Fehleranweisung


  1)Kommentar veröffentlichen Wenn das Posten von Kommentaren erfolgreich ist Sie können sich registrieren, wenn ein Kommentar vorhanden ist
     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:Bitte geben Sie User ein,Bitte geben Sie Skill ein
     # ./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

Fazit

Wenn Sie die Validierung eines externen Schlüssels überprüfen, erhalten Sie den Wert, indem Sie mit create statt build auf die Datenbank zugreifen. Anscheinend existierten Skill_id und User_id, aber aufgrund der externen Schlüsselbeschränkung in der Migrationsdatei mussten diese Werte aus einer anderen Tabelle übernommen werden.

Konstruktion

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 'Einen Kommentar posten' do
  before do
    @comment = FactoryBot.build(:comment)
  end

    context 'Wenn das Posten von Kommentaren gut geht' do
      it 'Sie können sich registrieren, wenn ein Kommentar vorliegt' 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 'Einen Kommentar posten' do
  before do
    @comment = FactoryBot.create(:comment)
  end

    context 'Wenn das Posten von Kommentaren gut geht' do
      it 'Sie können sich registrieren, wenn ein Kommentar vorliegt' do
        expect(@comment).to be_valid
      end
    end
...

Recommended Posts

[Unit Test Code] Obwohl es einen externen Schlüssel gibt, wird "Bitte geben Sie XX ein" gesagt
Ich habe ein ActionController :: MissingExactTemplate, obwohl ich eine Datei habe
Ich möchte einen Unit Test schreiben!
Ich erhalte eine javax.mail.AuthenticationFailedException, obwohl ich mich nicht authentifiziert habe.