我知道有很多类似的问题,但没有一个适用于同一场景 - 所以请不要将其标记为重复。
我正在试图弄清楚如何执行控制器方法的测试,该方法调用注入工厂服务的方法,执行$ http调用并返回json数组。
这就是我所拥有的:
angular.module('myApp', [])
.factory('callsFact', function($http) {
var urlWrite = 'write.php';
return {
write : function(content) {
return $http({
method: 'POST',
url: urlWrite,
data: "content=" + content,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
});
}
};
})
.controller('ReadWriteCtrl', function($scope, callsFact) {
$scope.data = [];
$scope.content = 'Some content';
$scope.add = function() {
callsFact.write($scope.content).success(function(data) {
$scope.data.push({ id : data.id, content : $scope.content });
});
};
});
现在,这是我参加测试的地方,因为我不太清楚该怎么做(请不要批评 - 我正在寻求帮助):
describe('ReadWriteCtrl tests', function() {
var $scope,
callsFact;
beforeEach(function() {
module('myApp');
inject(function($rootScope, _callsFact_) {
$scope = $rootScope.$new();
callsFact = _callsFact_;
});
});
it('should add new content', inject(function($controller) {
$controller('ReadWriteCtrl', {
$scope : $scope,
callsFact : callsFact
});
$scope.data = [];
$scope.content = 'Some message';
$scope.add();
expect($scope.data.length).toBe(1);
}));
});
只是为了澄清 - 我正在试图弄清楚如何测试ReadWriteCtrl的add()方法。
答案 0 :(得分:0)
因此,在这种情况下,您可以使用callsFact
var mockPromise = {success: function(f){f({id:1})}};
var mockCallsFact = spyOn({}, 'add').andReturn(mockPromise);
$controller('ReadWriteCtrl', {
$scope : $scope,
callsFact : mockCallsFact
});
然后你也可以包括断言:
expect(mockCallsFact.add).toHaveBeenCalled();
您也可以使用模拟`httpBackend',但我赞成以这种方式模拟依赖项。