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?
Zwróć szczególną uwagę na wywołanie "andCallThrough" na końcu spyOn(). –
Twój kontroler wywołuje metodę usługi po utworzeniu, więc musisz podejrzeć tę metodę usługi przed wywołaniem kontrolera $. – Richard
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