angular - Typescript + jasmine.createSpy()
Jag skriver enhetstester för mitt Angular-projekt med Typescript
När jag försöker skapa en mock för någon tjänst, använder jag det här sättet:
const serviceMock = <IMyService>{
method: _.noop,
};
beforeEach(inject($injector => {
testingService = new AccountingService(serviceMock);
spyOn(serviceMock, 'method').and.callFake(()=>'hello');
}
detta fungerar okej men när jag försöker använda jasmine.createSpy(), får jag kompileringsfel:
const serviceMock = <IMyService>{
method: jasmine.createSpy('method').and.callFake(()=>'hello'),
};
Type '{ method: Spy;}' cannot be converted to type 'MyService'. Property 'getParams' is missing in type '{ method: Spy;}'.
Men getParams är en privat metod i MyService
Vad gör jag för fel?
Svar #1
Använd den typ som redan definierats och används av Jasmine SpyObj<T>.
const serviceMock: jasmine.SpyObj<IMyService> = jasmine.createSpyObj<IMyService>('service',['method']);
På detta sätt kommer varje metod i IMyService att förstärkas med Spy-metoderna:
serviceMock.method.and.callFake(()=>'hello');
Svar #2
Prova det med en mappad typ
export type Spied<T> = {
[Method in keyof T]: jasmine.Spy;
};
och kasta din servicemock med den
const serviceMock = Spied<IMyService>{
Ta en titt här för en detaljerad beskrivning
