2017-03-21 4 views
2

Ich habe ein Problem mit dem Testen einer Komponente mit MdDialogRef und einem Dienst injiziert. Ich würde gerne testen, dass diese Komponente den injizierten Dienst aufruft. Das Problem ist, dass ich Testkomponente mit MdDialogRef injected ruft Service

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

den Dienst mit den üblichen

nicht abrufen können, da die Komponente mit einem injizierten MDDialogRef wie diese abgerufen werden muss:

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

Dies ist eine Abhilfe für MdDialogRef, die sagt "kein Provider für MdDialogRef verfügbar", und wenn Sie viele Parameter benötigen. (Vielleicht gibt es einen besseren Weg, wie dies zu tun und dann Befestigung verwenden?)

So gibt keine Befestigung Dienst abrufen mit ... ‚debugElement.injector ...‘

Wenn der Dienst eingespritzt wird, ich habe einen anderen Umfang, weil der Spion nicht reagiert:

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

Jede Idee, wie ich hier den Umfang an die Komponente binden könnte oder den Dienst über die Komponente (dialogRef.componentInstance) abrufen?

Antwort

4

Wie konnte ich dieses Problem lösen:

Innerhalb Testcomponent, injizieren MdDialog und setzen dialogRef:

public dialogRef: MdDialogRef<TestComponent>; 

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

Innen TestComponent.spec, können Sie Testservice wie gewohnt durch die Vorrichtung erhalten

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(); 
    }); 

Um die entryComponents festzulegen, können Sie das BrowserDynamicTestingModule überschreiben.

+0

Wow, vielen Dank, das funktioniert :) !!! – Nadine

+0

wirklich hilfreich danke – agriboz