2017-12-22 15 views
0

Ich habe ein Problem, Unit-Test einen eckigen Service zu versuchen. Ich möchte überprüfen, ob dieser Dienst einen anderen Dienst aufruft, der in den Dienst eingefügt wird.Komponententest mit privatem Dienst injiziert mit Jasmin angular2

Lets sagen, dass ich dieses ServiceToTest haben, die ServiceInjected injiziert:

ServiceToTest .service.ts

@Injectable() 
 
export class ServiceToTest { 
 
    constructor(private _si: ServiceInjected) {} 
 
    public init() { 
 
     this._si.configure(); 
 
    } 
 

 
}

ServiceInjected.service.ts

@Injectable() 
 
export class ServiceInjected { 
 
    constructor() {} 
 
    public configure() { 
 
    /*Some actions*/ 
 
    } 
 

 
}

Mit diesen Leistungen jetzt schreibe ich meinen Unit-Test:

const serviceInjectedStub = { 
 
    configure(): void {} 
 
} 
 

 

 
describe('ServiceToTest service Test',() => { 
 
    beforeEach(() => { 
 
    TestBed.configureTestingModule({ 
 
     providers: [ServiceToTest , 
 
     { provide: ServiceInjected, useValue: serviceInjectedStub }] 
 
    }); 
 
    }); 
 
    
 
    it('should be initialize the service injected', inject([ServiceToTest], 
 
    (tService: ServiceToTest) => { 
 
     spyOn(serviceInjectedStub, 'configure'); 
 
     tService.init(); 
 
     expect(serviceInjectedStub.configure).toHaveBeenCalled(); 
 
    }));

ich meinen Test positiv zu erwarten, jedoch erhalte ich folgende Fehlermeldung:

Erwarteten Spion configure wurden angerufen.

Auf der anderen Seite funktioniert es OK, wenn ich den injizierten Service public auf diese Weise eingestellt:

private _si: ServiceInjected by public si: ServiceInjected 
+0

Siehe https://github.com/angular/angular/issues/10788. Sie könnten einfach den echten Dienst injizieren und ihn ausspionieren. Oder verwenden Sie DI überhaupt nicht und verwenden Sie 'new ServiceToTest (stub)', um den Dienst zu testen. Oder verwenden Sie useFactory wie im Problem erläutert. –

Antwort

1

Sie spionieren nicht auf dem zu Ihrem TestBed gebunden Service. Holen Sie sich das Service von Ihrem Testbed

beforeEach(() => { 
    TestBed.configureTestingModule({ 
    providers: [ServiceToTest , 
     { provide: ServiceInjected, useValue: serviceInjectedStub }] 
    }); 
    injectedService = TestBed.get(ServiceInjected); 
}); 

Und Test auf es

spyOn(injectedService, 'configure').and.returnValue(/* return same data type here */); 
// ... 
expect(injectedService.configure).toHaveBeenCalled(); 
+0

Thx Kumpel !! Urlaub ist um 17 Uhr für mich heute! : p – RjHiruma

+0

Kein Problem, genießen Sie sie: D – trichetriche

0

verwenden.

spyOn (serviceInjectedStub, 'configure') and.returnValue (Konfig); // config ist mock

-1

Sie ein Mock-Service wie verwenden sollte:

class MockAuthService extends AuthService { 
    isAuthenticated() { 
    return 'Mocked'; 
    } 
} 

Auf diese Weise können Sie die Kontrolle über den Service, die Sie nicht testen und konzentrieren sich auf der anderen Seite.

nun prüfen, ob der Dienst, den Sie ein Mock-Variable hinzufügen können richtig vielleicht genannt wird, die auf true gedreht wird, wenn der Schein-Dienst aufgerufen wird.

Verwandte Themen