2013-10-24 6 views
21

Używam v1.2.0-rc.3 AngularJS ze strukturą testową Jasmine.Jak testować za pomocą Jasmine i kontrolera AngularJS, który wywołuje metodę usługi, która zwraca obietnicę

Próbuję potwierdzić, że kontroler wywołuje metodę usługi. Metoda serwisowa zwraca obietnicę. Kontroler wygląda następująco:

angular.module('test', []) 
.controller('ctrl', ['$scope', 'svc', function ($scope, svc) { 
    $scope.data = []; 
    svc.query() 
    .then(function (data) { 
    $scope.data = data; 
    }); 
}]); 

chcę przetestować, że dane są przypisane do zakresu kiedy zostanie rozwiązany metoda usługa na odroczony. I stworzyliśmy makietę za usługę, a test jednostka wygląda następująco:

describe('ctrl', function() { 
    var ctrl, scope, svc, def, data = [{name: 'test'}]; 
    beforeEach(module('test')); 
    beforeEach(inject(function($controller, $rootScope, $q) { 
    svc = { 
     query: function() { 
     def = $q.defer(); 
     return def.promise; 
     } 
    }; 
    scope = $rootScope.$new(); 
    controller = $controller('ctrl', { 
     $scope: scope, 
     svc: svc 
    }); 
    })); 
    it('should assign data to scope', function() { 
    spyOn(svc, 'query').andCallThrough(); 
    deferred.resolve(data); 
    scope.$digest(); 
    expect(svc.query).toHaveBeenCalled(); 
    expect(scope.data).toBe(data); 
    }); 
}); 

Spodziewam metoda zapytań od SVC się nazywać, ale najwyraźniej nie ma.

Podążałem za this poradnikiem przedśmieszania obietnic w testach jednostkowych.

Co robię źle?

Odpowiedz

28

Wygląda na to, że umieszczałem mojego szpiega w niewłaściwym miejscu. Po umieszczeniu go w przedEach, test przechodzi.

beforeEach(inject(function($controller, $rootScope, $q) { 
    svc = { 
     query: function() { 
     def = $q.defer(); 
     return def.promise; 
     } 
    }; 
    spyOn(svc, 'query').andCallThrough(); 
    scope = $rootScope.$new(); 
    controller = $controller('ctrl', { 
     $scope: scope, 
     svc: svc 
    }); 
    })); 
+2

Zwróć szczególną uwagę na wywołanie "andCallThrough" na końcu spyOn(). –

+0

Twój kontroler wywołuje metodę usługi po utworzeniu, więc musisz podejrzeć tę metodę usługi przed wywołaniem kontrolera $. – Richard

+0

Czy możesz pokazać pełny przykład pracy? Nie mogę tego zmusić do działania! :/ Próbowałem wielu różnych rzeczy z powyższym, ale wszystko wraca niezdefiniowane – SinSync