2016-02-03 9 views
9

Używam MeteorJS z kątem i chcę przetestować kontroler. Mój kontroler używa $ reactive (this) .attach ($ scope). Muszę sprawdzić, czy ta metoda została wywołana.Jasmine spyOn na funkcji i zwróconym obiekcie

tworzę coś takiego dla spy:

var $reactive = function(ctrl) { 
    return { 
     attach:function(scope) {} 
    } 
}; 

Więc mogę nazwać go tak:

$reactive('aaa').attach('bbb'); 

jaki sposób można zrobić to w testach?

spyOn($reactive, 'attach'); 

Nie działa. Mam Błąd: Metoda attach() nie istnieje

A jak sprawdzić, czy została wywołana? To jest dobry telefon?

expect($reactive).toHaveBeenCalledWith(controller); 

A jak sprawdzić, czy funkcja attach została wywołana z args (scope)?

+0

Wygląda '$ reactive' zwraca obiekt, który zawiera metodę załączyć, prawda? I chcesz przetestować tę metodę 'attach', która została wywołana. – Raulucco

+0

@Raulucco Dokładnie – psalkowski

Odpowiedz

4

Będziesz musiał sfałszować komponent $reactive. Zastąp go szpiegiem, który zwraca wartość spyObj w zakresie testu. Następnie wywołaj metodę, która zawsze powoduje uruchomienie i testowanie metody $reactive.

var reactiveResult = jasmine.createSpyObj('reactiveResult', ['attach']); 
var $reactive = jasmine.createSpy('$reactive').and.returnValue(reactiveResult); 
var controller = {}; 
    beforeEach(function() { 
     module(function ($provide) { 
     $provide.factory('$reactive', $reactive); 
     }); 
     module('yourAppModule'); 
    }); 

it('Should call attach', function() { 
    $reactive(controller).attach(); 
    expect($reactive).toHaveBeenCalledWith(controller); 
    expect(reactiveResult.attach).toHaveBeenCalled(); 
}) ; 

Można podać $reactive szpiega do kontrolera Zależności też:

var reactiveResult = jasmine.createSpyObj('reactiveResult', ['attach']); 
var $reactive = jasmine.createSpy('$reactive').and.returnValue(reactiveResult); 
var ctrl; 
    beforeEach(inject(function ($controller) { 
     ctrl = $controller('YourController', {$reactive: $reactive }); 
    })); 

it('Should call attach', function() { 
    //ctrl.triggerThe$reactiveCall 
    expect($reactive).toHaveBeenCalledWith(ctrl); 
    expect(reactiveResult.attach).toHaveBeenCalled(); 
}) ; 
+0

Wielkie dzięki! Teraz wiem coś więcej o testach. – psalkowski

Powiązane problemy