2017-03-21 1 views
2

MdDialogRef 및 서비스가 주입 된 구성 요소를 테스트하는 데 문제가 있습니다. 이 구성 요소가 주입 된 서비스를 호출하고 있는지 테스트하고 싶습니다. 문제는 주입 MDDialogRef와 구성 요소는 다음과 같이 검색 할하기 때문에 나는 보통MdDialogRef가 삽입 된 테스트 구성 요소가 호출 서비스입니다.

fixture = TestBed.createComponent(...); 
component = fixture.componentInstance; 
service = fixture.debugElement.injector.get(Service); 

과 서비스를 검색 할 수 있다는 것입니다 : 이것은 MdDialogRef, 대한 해결 방법입니다

dialog = TestBed.get(MdDialog); 
dialogRef = dialog.open(CompanyLogoComponent); 
component = dialogRef.componentInstance; 

하는 'MdDialogRef에 사용할 수있는 공급자가 없습니다'라고 말하면서 많은 매개 변수가 필요한 경우를 말합니다. (어쩌면이 작업을 수행 한 후 고정을 사용하는 방법을 더 나은 방법이 무엇입니까?)

그래서, 가능한 고정이와 ... 서비스를 검색하지 않으려면 'debugElement.injector를 ...'

서비스를 주입,

it('method should call service', inject ([Service], (service: Service) => { 
expect(service).toBeTruthy(); 
spyOn(service, 'method').and.callThrough(); 
component.methodCallingService(); 
expect(service.method).toHaveBeenCalled(); 
})); 

내가 여기에 구성 요소로 범위를 결합 또는 구성 요소 (dialogRef.componentInstance)를 통해 서비스를 검색 할 수있는 방법 어떤 생각을 : 스파이가 반응하지 않기 때문에 나는 다른 범위가?

답변

4

나는이 해결할 수 방법 :

내부 TestComponent, MdDialog를 주입하고 설정 dialogRef : 고정 장치를 통해 평소와 같이

public dialogRef: MdDialogRef<TestComponent>; 

constructor(private dialog: MdDialog, private service: TestService){} 

내부 TestComponent.spec, 당신이 얻을 수있는 TestService을

describe('TestComponent',() => { 
    let component: TestComponent; 
    let testService; 
    let fixture; 

    beforeEach(async(() => { 
    TestBed.configureTestingModule({ 
     imports: [ 
     MaterialModule, 
     MdDialogModule], 
     declarations: [TestComponent], 
     providers: [TestService] 
    }) 
    .overrideModule(BrowserDynamicTestingModule, { 
     set: { 
     entryComponents: [TestComponent] 
     } 
    }) 
    .overrideComponent(TestComponent, { 
    set: { 
     providers: [ 
     {provide: TestService, useClass: MockTestService}, 
     ] 
    } 
    .compileComponents(); 
    })); 

    beforeEach(() => { 
    fixture = TestBed.createComponent(TestComponent); 
    component = fixture.componentInstance; 
    companyService = fixture.debugElement.injector.get(TestComponent); 
    fixture.detectChanges(); 
    }); 

    it('should create',() => { 
    expect(component).toBeTruthy(); 
    }); 

entryComponents를 설정하려면 BrowserDynamicTestingModule을 재정의 할 수 있습니다.

+0

와우, 고마워, 그 작품 :)! – Nadine

+0

정말 도움이됩니다. 감사합니다. – agriboz

관련 문제