【RSpec】결합 테스트 코드로 에러가 나오거나 나오지 않거나 ~ 안정되지 않은 수수께끼가 풀렸다 ~

오늘의 해결 사건은 이쪽



조인 테스트 코드를 실행하는 경우 코드를 괴롭히지 않고 갑자기 오류가 발생합니다.



다시 한 번하면 오류가 발생하지 않거나


일어난 브라우저를 보면 너무 움직임이 빠르기 때문에
「이 녀석, 만약이나 움직임이 너무 빨라서 자신이 무엇을 하고 있는지 모르는 게 아닌가?」
라고, 감당하고 있었다.
로그인하고 있을 때의 브라우저의 움직임도 눈에도 멈추지 않는 빨리이고, 브라우저가 갱신된 순간에는 이제 텍스트가 입력되고 있다.



범인은 킹 크림슨이었다!
왜 기사를 쓰는 건 좀 어떨지 하고 있다고 생각하기 때문에 제대로 조사해 보았다.

오류를 읽어보십시오.


Failures:

  1) Reviews レビューの編集と削除 レビューの編集画面に遷移したとき レビュータイトルにデータが入っていること
     Failure/Error: let(:party) { FactoryBot.create(:party) }

     ActiveRecord::RecordInvalid:
       バリデーションに失敗しました: パスワードは不正な値です

⬇️⬇️⬇️たまにこれも出る⬇️⬇️⬇️
  1) Reviews レビューの編集と削除 編集画面に遷移できる トップページに表示されている最新レビューから編集画面に遷移できる
     Failure/Error: @current_user_review = FactoryBot.create(:review, user: user)

     ActiveRecord::RecordInvalid:
       バリデーションに失敗しました: パスワードは不正な値です


FactoryBot에서 생성하고 있는 데이터가 나쁨을 하고 있는 것은 아닐까 생각 바리데이션을 재검토해 보았다.

spec/factories/reviews.rb

FactoryBot.define do

  factory :review do
    title       { Faker::JapaneseMedia::Doraemon.gadget }
    content     { Faker::JapaneseMedia::Doraemon.gadget }

    association :user
    association :party

    after(:build) do |review|
      review.image.attach(io: File.open('public/images/test_image.jpg'), filename: 'test_image.jpg')
    end
  end
end

spec/factories/parties.rb


FactoryBot.define do

  factory :party do
    name         { Faker::JapaneseMedia::Doraemon.character }
    introduction { Faker::JapaneseMedia::Doraemon.character }
    season_id    { 2 }
    country_id   { 2 }
    genre_id     { 2 }
    official_url { Faker::JapaneseMedia::Doraemon.character }

    association :user


    after(:build) do |party|
      party.image.attach(io: File.open('public/images/test_image.jpg'), filename: 'test_image.jpg')
    end
  end
end


spec/factories/users.rb
FactoryBot.define do

  factory :user do
    nickname              { Faker::JapaneseMedia::Doraemon.character }
    email                 { Faker::Internet.free_email }
    password              { Faker::Internet.password(min_length: 6) }
    password_confirmation { password }
    gender_id             { 2 }
    profile               {Faker::JapaneseMedia::Doraemon.gadget}
    genre_id              { 2 }
    admin                 { false }
  end

  factory :admin_user do
    nickname              { Faker::JapaneseMedia::Doraemon.character }
    email                 { Faker::Internet.free_email }
    password              { Faker::Internet.password(min_length: 6) }
    password_confirmation { password }
    gender_id             { 4 }
    profile               {Faker::JapaneseMedia::Doraemon.gadget}
    genre_id              { 4 }
    admin                 { true }
  end

end
association :review를 users.rb에 쓰거나 여러 가지 시도했지만 관련없는 오류가 발생합니다.

시도한 것



여러가지 조사해 보았는데 테스트 때에 사용하고 있다 let 의 부분을 바꾸면 좋을 것 같았다.

spec/system/reviews_spec.rb
RSpec.describe "Reviews", type: :system do
  let(:admin_user) { FactoryBot.create(:user, admin: true) }
 #let(:party) { FactoryBot.create(:party) }  ⬅️ここを下記コードに変更
  let(:party) { FactoryBot.create(:party, user: user) }  ⬅️追記した
  let(:user) { FactoryBot.create(:user) }

〜以下略〜


이제 오류가 사라졌습니다.

원인으로서는 let(:user) 를 정의하고 있는데, party 인스턴스의 작성시에 새롭게 user를 작성해 그것을 연결하고 있기 (위해)때문에, 같은 유저가 이미 있는 것에 의해 에러가 되고 있었던 것 같다.

인수에 user가 필요한 케이스였으므로, 테스트내에서 작성한 let(:party) 에 그 user를 관련해 보았더니, 이것으로 좋았던 것 같다.

오늘도 하나 성장.
나는 오류를 넘어서 강해진다 (누구

도움이되었습니다.



@eitches
Rspec의 관련 주위에서 "밸리데이션에 실패했습니다"가 발생했을 때

고마워요.

좋은 웹페이지 즐겨찾기