2016-06-29 7 views
1

다른 테이블의 내용에 따라 동적으로 범위를 추가 한 ActiveRecord 클래스가 있습니다.레일 테스트, 조명기 및 클래스 로딩 순서

(간체 코드 예제)

class Thing < ActiveRecord::Base 

    Feature.all.each do |feature| 
    scope feature.name, ->{joins(:feature).where("feature.name = #{feature.name})} 
    end 
end 

응용 프로그램의 UI의 또 다른 부분은 검색과 검색의 일환으로 이러한 기능의 범위를 적용 할 수있는 "것 표시"입니다.

이 앱은 실행중인 앱에서 모두 잘 작동합니다.

그러나 테스트에서는 물건이로드되는 순서에 따라 성공한 것으로 보입니다. 때로는 Thing에 예상 범위가 있으며 다른 시간에는 그렇지 않습니다. 테스트를 실행하기 전에 Feature 클래스와 픽스쳐를 먼저 Feature.count을 호출하여로드하도록 할 수 있다고 생각했지만 작동하지 않습니다.

클래스/조명기를 강제로로드 할 수있는 방법이 있습니까?

+0

이 항목은 [this] (http://stackoverflow.com/a/28515064/2116518) 또는 [this] (https://sanjusoftware.wordpress.com/2010/12/17/)과 관련이 없습니다. 레일 정착물 -로드 주문 /)? –

+0

@NicNilov 필자는 Postgres를 실행하지 않고 데이터베이스에 외래 키 제약 조건이 없으며 테스트 실행 순서에 따라 테스트가 통과/실패합니다. 따라서 연결된 문제는 적용되지 않습니다. – z5h

답변

0

클래스 전에 조명기가로드되는지 확인하기위한 목표로 살펴볼 몇 가지 방향이 있습니다.

하나는 조명기가 로딩을 끝내고 다시로드하여 적절한 범위를 생성하는 Thing 클래스를 강제로드하는 것입니다. 이 문제는 조명기 이벤트를 감지하는 방법을 찾을 수 없다는 것입니다. 접두사 문제는 config.cache_classes = true이있는 상황에서 개별 클래스를 다시로드하면 상당히 해킹 될 수 있다는 것입니다.

또 다른 더 유망한 접근법은 this answer에 설명되어 있으며 테스트 러너 작업을 래퍼에 배치하여 조명기가 먼저로드되도록합니다.