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
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. –