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

Relaterade artiklar