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

Relaterade artiklar