2015-01-07 8 views
8

Próbuję zacząć z karma-jaśminu i zastanawiam się, dlaczego ten test nie powiedzie się:AngularJS - Jak sprawdzić, czy funkcja jest wywoływana z poziomu innej funkcji?

it("should call fakeFunction", function() { 
    spyOn(controller, 'addNew'); 
    spyOn(controller, 'fakeFunction'); 
    controller.addNew(); 
    expect(controller.fakeFunction).toHaveBeenCalled(); 
}); 

W moim kontrolera, że ​​już wcześniej utworzonej w tym teście Mam następujący:

function addNew() { 
    fakeFunction(3); 
} 

function fakeFunction(number) { 
    return number; 
} 

zarówno addNew i fakeFunction narażone są na podstawie:

vm.addNew = addNew; 
vm.fakeFunction = fakeFunction; 

testy, jednak nie powiedzie się z następujących czynności:

Expected spy fakeFunction to have been called.

mogę przepustkę testową gdybym wywołać funkcję z poziomu mojego testu. Miałem jednak nadzieję, że mogę przetestować, czy fakeFunction został wywołany przez inną funkcję. Jaki jest właściwy sposób, aby to osiągnąć?

Aktualizacja:

//test.js 

beforeEach(function() { 

    module("app"); 

    inject(function(_$rootScope_, $controller) { 

     $scope = _$rootScope_.$new(); 
     controller = $controller("CreateInvoiceController", {$scope: $scope}); 

    }); 

}); 

Gdybym przetestować coś takiego:

it('should say hello', function() { 
    expect(controller.message).toBe('Hello'); 
}); 

Test przechodzi jeżeli kładę następujących w moim kontrolera:

var vm = this; 
vm.message = 'Hello'; 

po prostu chcę wiedzieć jak mogę sprawdzić, czy funkcja publiczna została wywołana z innej funkcji.

Odpowiedz

8

Twoja metoda addNew wywołuje . Jednak nie jest to wywołanie controller.fakeFunction, co jest twoim oczekiwaniem.

Będziesz musiał zmienić swój kod, aby używać kontrolera, a nie tych niezależnych funkcji.

EDYCJA: Nie musisz też szpiegować swojej funkcji addNew. Powoduje to zastąpienie funkcji szpiegiem. Alternatywą jest zmiana tego ustawienia na:

spyOn(controller, 'addNew').and.callThrough() 
+0

Próbowałem wywoływać 'vm.fakeFunction' i to też nie działa. Jak dokładnie to robi? –

+0

@RaphaelRafatpanah Nie wiem, czym jest 'vm', ale to nie jest to, co testujesz, testujesz, że' controller.fakeFunction' został nazwany – Vadim

+0

Przepraszamy za nie wyjaśnienie. 'vm' jest wspólną zmienną do przechwytywania' this' w kontrolerach Angular. W efekcie 'vm' i' controller' powinny odnosić się do 'this'. –

7

Sam osobiście trafiłem na ten problem. Poprzednia odpowiedź @Vadima ma odpowiednie zasady, ale nie sądzę, aby wszystko było jasne. W moim przypadku próbuję wywołać funkcję publiczną usługi z innej funkcji. Oto istotne fragmenty:

Usługa:

angular.module('myApp').factory('myService', function() { 
 

 
    function doSomething() { 
 
     service.publicMethod(); 
 
    } 
 

 
    function publicMethod(){ 
 
     // Do stuff 
 
    } 
 

 
    var service = { 
 
     publicMethod: publicMethod 
 
    }; 
 

 
    return service; 
 
});

Test:

it('calls the public method when doing something', function(){ 
 
    spyOn(service, 'publicMethod'); 
 

 
    // Run stuff to trigger doSomething() 
 

 
    expect(service.publicMethod).toHaveBeenCalled(); 
 
});

Kluczem tutaj jest, że funkcjono W trakcie testowania należy wywoływać to samo odwołanie, co funkcja publiczna, która jest przedmiotem obserwacji.

Powiązane problemy