javascript - Använda Jasmine för att spionera på en funktion utan ett objekt
Jag använder Jasmine och har en bibliotek js-fil med många funktioner som inte är kopplade till något objekt (d.v.s. är globala). Hur gör jag för att spionera på dessa funktioner?
Jag försökte använda window/document som objektet, men spionen fungerade inte även om funktionen kallades. Jag försökte också att kapsla in det i ett falskt objekt enligt följande :
var fakeElement = {};
fakeElement.fakeMethod = myFunctionName;
spyOn(fakeElement, "fakeMethod");
och testa med
expect(fakeElement.fakeMethod).toHaveBeenCalled();
Detta fungerar inte heller eftersom spionen inte fungerade.
Svar #1
Om du definierar din funktion:
function test() {};
Då är detta ekvivalent med:
window.test = function() {} /* (in the browser) */
Så spyOn(window, 'test') borde fungera.
Om det inte är det, borde du också kunna:
test = jasmine.createSpy();
Om ingen av de där fungerar, är det något annat som pågår med din uppsättning.
Jag tror inte att din fakeElement-teknik fungerar på grund av vad som händer bakom kulisserna. Den ursprungliga globalMethod pekar fortfarande på samma kod. Det spionering gör är att proxya den, men bara i kontexten av ett objekt. Om du kan få din testkod att anropa via fakeElement skulle det fungera, men då skulle du behöva ge upp globala funktioner.
Svar #2
TypeScript-användare:
Jag vet att TS frågade om JavaScript, men för alla TypeScript-användare som stöter på detta och vill spionera på en importerad funktion, här är vad du kan göra.
I testfilen, konvertera importen av funktionen från detta:
import {foo} from '../foo_functions';
x = foo(y);
Till detta:
import * as FooFunctions from '../foo_functions';
x = FooFunctions.foo(y);
Då kan du spionera på FooFunctions.foo :)
spyOn(FooFunctions, 'foo').and.callFake(...);
// ...
expect(FooFunctions.foo).toHaveBeenCalled();
Svar #3
Det finns 2 alternativ som jag använder (för jasmine 2)
Den här är inte riktigt tydlig eftersom det verkar som om funktionen egentligen är falsk.
test = createSpy().and.callFake(test);
Den andra mer ordrik, mer explicit och "renare":
test = createSpy('testSpy', test).and.callThrough();
-> jasmine källkod för att se det andra argumentet
