Rspec에서 다 대다 Factory를 만들고 SystemSpec에서 테스트했을 때의 노트 [RSpec, FactoryBot]

6854 단어 RSpecRailsFactoryBot

배경



Rspec에서 다대다 관계를 만들고 SystemSpec에서 테스트했습니다.
원래의 테이블 구조의 복잡성도 있어, 꽤 고생했으므로, 이하에 노트를 정리합니다.

실행 완료는 다음과 같습니다.
  • Rspec 3.9
  • Rails 5.2.4.2

  • 테이블 구조



    테이블 구조는 다음과 같습니다. 메인 테이블은 offices (한 회사의 지사)와 shops 가 참여합니다. office 에는 반드시 evebt 가 있습니다.



    발생한 문제



    모델 메소드의 관계로, 아무래도 shopsshops 를 만들 때, 거기에 묶는, category 가 필요하게 되었습니다. 그러나 구조상 이런 식으로 작성한 것은 오류가 발생했습니다.
    let!(:shop){FactoryBot.create(:shop)}
    let!(:event){FactoryBot.create(:event)}
    #=> ここで eventに紐づくshopがないとエラーになる構造になっていた
    let!(:event_shops){FactoryBot.create(:event_shop, event: event, shop: shop)}
    

    해결 방법



    그래서, eventsfactory 생성시에, 동시에 관련하는 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] 는 복수회 생성됩니다. 따라서, 동시에 생성되는 categorytrait 는 매번 다른 category (FK)로 하지 않으면, FK의 중복 에러가 되어 버렸습니다.

    또한, event 에서 shopcateogoryid 그리고 오류가 발생했습니다.

    그 때문에, system spec 를 이용해, 하나하나 다른 event (FK)의 카테고리를 작성하도록(듯이) 했습니다.

    끝에 (참고 사이트 등)



    해결에 오랜 시간이 걸렸습니다만, 어떻게든 해결할 수 있어서 좋았습니다!
    이번에는 DB의 구조가 복잡했기 때문에, 이러한 복잡한 Spec을 써야 되어 버렸습니다만,
    향후는 DB 설계를 확실히 해, 보다 심플한 테스트로 끝내고 싶습니다. . . .

    ▼특히 참고로 한 기사 등
    - FactoryGirl에서 '다대다' 또는 '여러 일대다' 연관 설정
    - Factorybot의 trait를 사용하여 has_many가 이중에 있는 복잡한 asociation이 포함된 데이터를 준비
    - FactoryBot (구 FactoryGirl)의 sequence 및 .next

    좋은 웹페이지 즐겨찾기