1

시나리오 : 실제 서비스 my-service을 사용하여 통합 테스트 구성 요소 A에 설치하려고합니다. 전역으로 모든 구성 요소에 서비스를 주입하는 초기화 프로그램이 있습니다 : application.inject('component', 'myService', 'service:my-service');. 구성 요소 A는 템플릿에 구성 요소 B를 사용하며 템플릿에 모두 myService을 사용합니다.Ember.js 구성 요소 통합 테스트 : 전역 주입 및 중첩 구성 요소를 사용하는 방법은 무엇입니까?

글로벌 인젝션은 어떻게 다시 작성합니까? 전체 응용 프로그램이 없으므로 필요한 매개 변수가 없기 때문에 실제 이니셜 라이저를 가져오고 실행할 수 없습니다. this.inject.service은 글로벌 응용 프로그램 컨텍스트가 아닌 테스트 컨텍스트에 주입하기 때문에 작동하지 않습니다.

나는 서비스를 체인 끝까지 내 모든 구성 요소의 템플릿을 변경할 수 있습니다 : {{b-component myService=myService}}을하고

this.render(hbs`{{a-component myService=myService}}`); 

그러나 그것은 최후의 수단이다. 또한 글로벌 인젝션을 제거하고 모든 구성 요소를 수동으로 주입 할 수있었습니다. 그것은 최후의 수단이기도합니다.

나는이 문제에 대한 이야기를 https://github.com/emberjs/ember.js/issues/12277으로 추적했습니다. 거의 시행되었지만 대대적 인 시험 통일 https://github.com/emberjs/rfcs/pull/119에 찬성하여 마감했습니다. Grand Testing Unification을 기다리는 동안 해결책이 있습니까?

답변

2

https://stackoverflow.com/users/1157494/robert-jackson의 힌트를 통해 누락 된 부분을 찾을 수있었습니다.

import { initialize } from 'my-app/initializers/my-initializer'; 

// ... 

beforeEach() { 
    initialize(Ember.getOwner(this)); 
} 
이제

그들이 필요로하는 글로벌 주사가 귀하의 모든 구성 요소 : 당신은 당신이 초기화에 공급하는 데 필요한 누락 된 매개 변수 테스트 맥락에서 소유자를 조회 할 수 있습니다!