테스트 기록 유출을 어떻게 처리합니까?

3995 단어 leaksrspectestsrails
나는 전에도 해봤지만 어떤 대가를 치르더라도 피해야 하는 유해하고 디버그하기 어려운 것입니다.

오늘 나는 CI에서 이상한 실패를 겪었고 조사하는 동안 다른 사양이 테스트 DB에 기록을 남기고 DB 트랜잭션 외부에서 작동하는 것이 분명해졌습니다.

거래성을 회피하는 두 가지 일반적인 방법을 알고 있습니다.
  • before(:all) 블록에 레코드를 생성합니다. 때때로 이것은 반복 설정 시간을 절약하기 위해 필요할 수 있지만 더 안전한 접근을 위해 TestProfbefore_all 헬퍼를 살펴보십시오.
  • 예제 컨텍스트 외부에서 인라인 코드로 레코드 만들기:

  • describe "#some_method" do
      # the two users fabricated in this hash will leak.
      {
        regular: FactoryBot.create(:user), 
        elevated: FactoryBot.create(:super_user),
      }.each_pair do |permission_level, record| 
        it "works for '#{#{permission_level}}'" do
          # some asserts ...
        end
      end
    end
    


    앞으로 이와 같은 경우를 방지하려면 테스트 DB에 앱에서 사용되는 인기 모델의 기록이 없는지 확인하는 간단한 후크를 설정하는 것이 좋습니다.
    일반적으로 사양 도우미에 의해 로드되는 파일 위치에 배치합니다spec/support/hooks/.

    class RecordsLeftInTestDBError < StandardError; end
    
    RSpec.configure do |config|
      config.after(:suite) do
        counts = {
          some_records: SomeModel.count,      
        }
    
        counts.values.sum.positive? &&
          # I'd prefer `abort` to `raise`, but for some reason
          # it  does not fail the RSpec run when called from an
          # after-suite hook like this.
          raise(
            RecordsLeftInTestDBError.new(
              "Leak detected!\n" \
              "Records in the test DB after running the suite:\n" \
              "#{counts}",
            ),
          )
      end
    end
    

    좋은 웹페이지 즐겨찾기