【단체 테스트 코드】외부 키가 있는데 「〇〇를 입력해 주세요」라고 한다
문제
단체 테스트 코드로 「코멘트를 보존할 수 있을 때」라고 하는 테스트를 실시했다.
그 때에 FactoryBot에서 작성한 외래 키인 skill_id와 user_id는 존재하는데 왠지 그 둘이 비어 있다고 했다.
오류 문
1) Comment コメント投稿 コメント投稿がうまくいくとき コメントが存在すれば登録できる
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: Userを入力してください, Skillを入力してください
# ./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
결론
외래 키의 검증을 체크할 때는 build가 아닌 create로 데이타베이스에 액세스 하는 것으로 값을 취득한다.
외형상에서는 skill_id와 user_id가 존재하고 있었지만, migration 파일로 외래 키 제약을 걸고 있기 때문에, 그 값은 다른 테이블로부터 가져온 값이 아니면 안된다는 것이었다.
구조
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 'コメント投稿' do
before do
@comment = FactoryBot.build(:comment)
end
context 'コメント投稿がうまくいくとき' do
it 'コメントが存在すれば登録できる' 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 'コメント投稿' do
before do
@comment = FactoryBot.create(:comment)
end
context 'コメント投稿がうまくいくとき' do
it 'コメントが存在すれば登録できる' do
expect(@comment).to be_valid
end
end
...
Reference
이 문제에 관하여(【단체 테스트 코드】외부 키가 있는데 「〇〇를 입력해 주세요」라고 한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/magatama/items/f7469ee2fdfdb1cf3155텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)