Я пытаюсь проверить, что служба вызывается из контроллера с помощью шпиона и макета. Ошибка Жасмин, что он пытается вызвать фактический сервис? Что я делаю не так?
контроллер
angular.module('vsApp').controller('kitsCtrl', function ($scope, productsDataService) {
productsDataService.getProducts("kit").success(function (data) {
$scope.products = data;
});
});
спекуляция
describe("Kits controller", function () {
var productsDataServiceMock, $controllerConstructor, scope;
beforeEach(module('vsApp'));
beforeEach(inject(function ($controller, $rootScope) {
$controllerConstructor = $controller;
scope = $rootScope.$new();
productsDataServiceMock = {
getProducts: function(type) {return {};}
};
}));
it('should call the products data service', inject(function () {
var ctrl = $controllerConstructor('kitsCtrl', {$scope: scope, productsDataService: productsDataServiceMock});
spyOn(productsDataServiceMock, 'getProducts').andCallThrough();
expect(productsDataServiceMock.getProducts).toHaveBeenCalled();
}));
});
ошибка
TypeError: 'undefined' is not a function (evaluating 'productsDataService.getProducts("kit").success(function (data) {
$scope.products = data;
})')
at /**removed**/public/app/controllers/kitsCtrl.js:9
В тесте есть две ошибки:
success()
, но ваш макет возвращает пустой объект. Таким образом, при вызове success()
, поскольку этот метод не существует, генерируется исключение.Мой совет: не создавайте макет. Шпион на реальном сервисе и использовать API реальных обещаний, а не обратные вызовы с успешным/обратным вызовом:
angular.module('vsApp').controller('kitsCtrl', function ($scope, productsDataService) {
productsDataService.getProducts("kit").then(function (data) {
$scope.products = data;
});
});
а также
var $controller;
beforeEach(inject(function (_$controller_, $rootScope) {
scope = $rootScope.$new();
$controller = _$controller_;
}));
it('should call the products data service', inject(function(productsDataService, $q) {
spyOn(productsDataService, 'getProducts').andReturn($q.when('someData'));
$controller('kitsCtrl', {$scope: scope});
expect(productsDataServiceMock.getProducts).toHaveBeenCalledWith('kit');
expect($scope.products).toBe('someData');
}));
$controllerConstructor
кажется, не определен в тестовой функции.