我在模拟和测试我的angular应用程序时遇到了麻烦。给定下面的文件,我总是得到错误延迟未定义。
如何用Promise正确地模拟API ?我如何测试API确实在运行,并将响应附加到$作用域。数据变量?
控制器angular.module('app').controller('controllerOne', [
'$scope',
'API',
function($scope, API) {
$scope.init = function() {
$scope.data = API.query(function(response) {
return response;
});
};
}
]);
<<p> API服务/strong> angular.module('app').factory('API', ['$resource',
function($resource) {
return $resource('api/url/:Id', {
Id: '@_id'
}, {
update: {
method: 'PUT'
}
});
}
]);
控制器规范
describe('app Module', function() {
beforeEach(function() {
module('app');
});
var mockAPI, q, $scope, ctrl;
beforeEach(function() {
mockAPI = {
query: function() {
var deferred = q.defer();
return deferred.promise;
}
};
});
beforeEach(inject(function($controller, $rootScope, $q) {
$scope = $rootScope.$new();
q = $q;
ctrl = $controller('controllerOne', {
$scope: $scope,
API: mockAPI
});
}));
it('should query API', function() {
spyOn(mockAPI, 'query').and.callThrough();
$scope.init();
deferred.resolve();
$scope.$root.$digest();
expect(mockAPI.query).toHaveBeenCalled();
});
});
如果我运行以下代码,一切正常,但我认为这是不对的,因为我正在初始化API。
it('should query API', function() {
mockAPI.query();
expect(mockAPI.query).toHaveBeenCalled();
});
正确的方法是什么?怎么做?
您遇到的问题是由于mockAPI查询中定义的延迟变量的作用域。它应该在套件级别确定范围,以便在您的测试中可以访问它以进行解析。
假设剩下的代码没问题,下面的代码将解决deferred is not defined的问题。
describe('app Module', function() {
beforeEach(function() {
module('app');
});
var mockAPI, deferred, q, $scope, ctrl;
beforeEach(function() {
mockAPI = {
query: function() {
deferred = q.defer();
return deferred.promise;
}
};
});
beforeEach(inject(function($controller, $rootScope, $q) {
$scope = $rootScope.$new();
q = $q;
ctrl = $controller('controllerOne', {
$scope: $scope,
API: mockAPI
});
}));
it('should query API', function() {
spyOn(mockAPI, 'query').and.callThrough();
$scope.init();
deferred.resolve();
$scope.$root.$digest();
expect(mockAPI.query).toHaveBeenCalled();
});
});