Rspec에서 다 대다 Factory를 만들고 SystemSpec에서 테스트했을 때의 노트 [RSpec, FactoryBot]
6854 단어 RSpecRailsFactoryBot
배경
Rspec에서 다대다 관계를 만들고 SystemSpec에서 테스트했습니다.
원래의 테이블 구조의 복잡성도 있어, 꽤 고생했으므로, 이하에 노트를 정리합니다.
실행 완료는 다음과 같습니다.
테이블 구조
테이블 구조는 다음과 같습니다. 메인 테이블은
offices
(한 회사의 지사)와 shops
가 참여합니다. office
에는 반드시 evebt
가 있습니다.발생한 문제
모델 메소드의 관계로, 아무래도
shops
의 shops
를 만들 때, 거기에 묶는, category
가 필요하게 되었습니다. 그러나 구조상 이런 식으로 작성한 것은 오류가 발생했습니다.let!(:shop){FactoryBot.create(:shop)}
let!(:event){FactoryBot.create(:event)}
#=> ここで eventに紐づくshopがないとエラーになる構造になっていた
let!(:event_shops){FactoryBot.create(:event_shop, event: event, shop: shop)}
해결 방법
그래서,
events
의 factory
생성시에, 동시에 관련하는 shops
도 정의할 수 있는 팩토리를 작성하기로 했습니다.events 팩토리 만들기
작성한 Factory는 다음과 같이 되어 있습니다.
spec/factories/events.rb
FactoryBot.define do
factory :event do
office_id { nil }
name { "テストイベント" }
trait :with_shops do
after(:create) do |event|
category = FactoryBot.create(:category, :sequence)
create_list(:shop, 1, events: [event], category: category)
end
end
end
end
우선,
event
의 팩토리내에 factory
라고 하는 trait 를 작성해, shop
작성시에 관련하는 event
도 작성할 수 있도록 합니다. with_shops
에서 event
의 팩토리를 복수 작성할 수 있게 하고(여기에서는 하나만 필요하기 때문에 1개만), shop
로부터 create_list
의 인스턴스가 복수 넣을 수 있도록, 배열로 표기합니다.덧붙여
shop
가 일부러 events
를 사용해 호출하고 있는 것은, 나중에 해설합니다.System Spec에서 제대로 호출할 수 있도록
spec/factories/categories.rb
FactoryBot.define do
factory :category do
name { "医療系" }
trait :sequence do
sequence(:id, 100)
name { "服飾系" }
end
end
end
spec/system/events_spec.rb
let!(:event) { FactoryBot.create(:event, :with_shops, office: office, shops: [shop]) }
# ここからcategoryをshopに当てはめることはできない
다음으로,
event
의 팩토리입니다만, 뷰안에서, [event]
는 복수회 생성됩니다. 따라서, 동시에 생성되는 category
의 trait
는 매번 다른 category
(FK)로 하지 않으면, FK의 중복 에러가 되어 버렸습니다.또한,
event
에서 shop
의 cateogory
에 id
그리고 오류가 발생했습니다.그 때문에,
system spec
를 이용해, 하나하나 다른 event
(FK)의 카테고리를 작성하도록(듯이) 했습니다.끝에 (참고 사이트 등)
해결에 오랜 시간이 걸렸습니다만, 어떻게든 해결할 수 있어서 좋았습니다!
이번에는 DB의 구조가 복잡했기 때문에, 이러한 복잡한 Spec을 써야 되어 버렸습니다만,
향후는 DB 설계를 확실히 해, 보다 심플한 테스트로 끝내고 싶습니다. . . .
▼특히 참고로 한 기사 등
- FactoryGirl에서 '다대다' 또는 '여러 일대다' 연관 설정
- Factorybot의 trait를 사용하여 has_many가 이중에 있는 복잡한 asociation이 포함된 데이터를 준비
- FactoryBot (구 FactoryGirl)의 sequence 및 .next
Reference
이 문제에 관하여(Rspec에서 다 대다 Factory를 만들고 SystemSpec에서 테스트했을 때의 노트 [RSpec, FactoryBot]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tanutanu/items/dc1d4f94713add33d5b5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)