2012-03-01 21 views
112

Jestem nowy w Jasmine i właśnie zaczęłam go używać. Mam plik biblioteki js z wieloma funkcjami, które nie są powiązane z żadnym obiektem (tj. Są globalne). Jak mam śledzić te funkcje?Używanie Jasmine do szpiegowania funkcji bez obiektu

Próbowałem używać okna/dokumentu jako obiektu, ale szpieg nie działał, mimo że funkcja została wywołana. Próbowałem też otoczenie go w fałszywym obiektu następująco:

var fakeElement = {}; 
fakeElement.fakeMethod = myFunctionName; 
spyOn(fakeElement, "fakeMethod"); 

i test z

expect(fakeElement.fakeMethod).toHaveBeenCalled(); 

to nie działa albo jako szpieg nie działa

Odpowiedz

126

Jeśli definiujesz swoją funkcję :

function test() {}; 

Następnie, jest to równoznaczne z:

window.test = function() {} /* (in the browser) */ 

Więc spyOn(window, 'test') powinien działać.

Jeśli tak nie jest, należy również być w stanie:

test = jasmine.createSpy(); 

Jeśli żadna z tych pracują, coś innego się dzieje z konfiguracją.

Nie sądzę, że twoja technika fakeElement działa ze względu na to, co dzieje się za kulisami. Oryginalny globalMethod nadal wskazuje ten sam kod. To, co szpieguje, to proxy, ale tylko w kontekście obiektu. Jeśli uda ci się uzyskać kod testowy do wywołania za pomocą fałszywego klucza, to zadziała, ale wtedy będziesz mógł zrezygnować z globalnego fns.

+1

Udało się! Myślę, że błąd, który popełniłem wcześniej, polegał na tym, że nazwałem metodę spyOn metodą method() zamiast metody. Dzięki! –

+2

Mam pewne problemy przy użyciu spyOn (okno, "test") przy użyciu chutzpah do uruchamiania testów w ramach naszej automatyzacji z powodu braku przypisania "okna". Używanie jaśmin.createSpy() obejmie to. – Henners

+5

jaśmin.createSpy() działał idealnie dla mnie. Dzięki! – dplass

36

Jest 2 alternatywą którego używam (na jaśminu 2)

To nie jest całkiem jednoznaczne, ponieważ wydaje się, że ta funkcja jest rzeczywiście fałszywy.

test = createSpy().and.callFake(test); 

Drugi bardziej gadatliwy, bardziej wyraźne i "czystsze":

test = createSpy('testSpy', test).and.callThrough(); 

->jasmine source code zobaczyć drugi argument

+0

To ma trochę więcej sensu i rozbija go na tyle, by powodzić z powodzeniem. +1 ode mnie. Dzięki, C § – CSS

22

użytkowników maszynopis:

wiem OP pytał o javascript, ale dla wszystkich użytkowników TypeScript, którzy natknęli się na tych, którzy chcą szpiegować zaimportowaną funkcję, oto możesz to zrobić.

W pliku testowego, konwersja import funkcji z tego:

import {foo} from '../foo_functions'; 

x = foo(y); 

do tego:

import * as FooFunctions from '../foo_functions'; 

x = FooFunctions.foo(y); 

Następnie można szpiegować FooFunctions.foo :)

spyOn(FooFunctions, 'foo').and.callFake(...); 
// ... 
expect(FooFunctions.foo).toHaveBeenCalled(); 
+2

Dzięki za podpowiedź TypeScript. Powinien być taki sam dla ES6/Babel, ale go nie wypróbowałem. – hgoebl

+0

Wygląda na to, że działa tylko w przypadku jawnego wywołania funkcji ** za pomocą aliasów FooFunctions **. Mam pasek funkcji(), który jest bazowym plikiem zwracającym baz() i chce przetestować, że baz() wywołuje funkcję foo(). Ta metoda nie działa w tym scenariuszu. –

+1

będzie możliwa, jeśli alias przyjmuje wewnątrz foo_functions 'const eksport FooFunctions = {bar foo};' i import w teście się 'import {FooFunctions} i” ../ foo_functions'.' jednak , alias nadal musi być jawnie użyty w prywatnej implementacji foo_functions, aby szpieg zadziałał. 'const result = FooFunctions.foo (params)' // spy zgłasza wywołanie 'const result = foo (params)' // spy zgłasza brak wywołania –

-1

musi być możliwe bez definiowania okna. funkcja globalna. Spróbuj:

var x = function() {} 

    spyX = spyOn(x, 'call') // 

    // something, that calls x 
    expect(spyX).toBeCalled() 
3

bardzo prosty sposób:

import * as myFunctionContainer from 'whatever-lib'; 

const fooSpy = spyOn(myFunctionContainer, 'myFunc'); 
Powiązane problemy