Typescript-syntax - Hur man spionerar på en Ajax-förfrågan?
Jag försöker skriva ett enhetstest där jag vill verifiera att ett ajax-anrop har gjorts. Koden är enkel:
it('test spycall',()=>{
spyOn($,"ajax");
//my method call which in turns use ajax
MyFunc();
expect($.ajax.calls.mostRecent().args[0]["url"].toEqual("myurl");
});
Felet som jag får :
Egenskapen 'calls' finns inte på typen '{settings:jqueryAjaxSettings):jQueryXHR;(url:string, settings?:JQueryAjaxSettings}
Svar #1
$.ajax.calls, bland annat, är en del av Jasmine-testningsramverket, inte JQuery i sig (Som du vet, Jasmine (eller snarare, Jasmine-Jquery, pluginen du använder) lägger till vissa felsökningsfunktioner i JQuerýs prototyp för att, ja, kunna testa ajax-anrop).
Det dåliga är att din .d.ts TypeScript-definitionsfil, filen som fungerar som ett gränssnitt mellan TypeScript och rena JS-bibliotek, inte är medveten om Jasmines funktioner.
Det finns flera sätt du kan närma dig att åtgärda detta, som
- ser om någon har justerat JQuery
.d.ts-filen för Jasmines funktioner eller - skapa den nya
.d.ts-filen själv genom att ändra den ursprungliga eller, (vad jag skulle göra) - skriva över TypeScript-definitionen genom att deklarera
$.ajaxsomany, eller att inte inkludera TypeScript-definitionen alls i din testkodbas och deklarera$somany.
Svar #2
Det finns 2 sätt att bli av med felet:
// 1
expect(($.ajax as any).calls.mostRecent().args[0].url).toEqual("myurl");
// 2
let ajaxSpy = spyOn($,"ajax");
expect(ajaxSpy.calls.mostRecent().args[0].url).toEqual("myurl");
Du kan också använda partiell matchning:
expect(($.ajax as any).calls.mostRecent().args).toEqual([
jasmine.objectContaining({url: "myurl"})
]);
