【发布时间】:2015-03-04 15:59:29
【问题描述】:
我有一个资源工厂
angular.module('mean.clusters').factory('Clusters', ['$resource',
function($resource) {
return $resource('clusters/:clusterId/:action', {
clusterId: '@_id'
}, {
update: {method: 'PUT'},
status: {method: 'GET', params: {action:'status'}}
});
}]);
还有一个控制器
angular.module('mean.clusters').controller('ClustersController', ['$scope',
'$location', 'Clusters',
function ($scope, $location, Clusters) {
$scope.create = function () {
var cluster = new Clusters();
cluster.$save(function (response) {
$location.path('clusters/' + response._id);
});
};
$scope.update = function () {
var cluster = $scope.cluster;
cluster.$update(function () {
$location.path('clusters/' + cluster._id);
});
};
$scope.find = function () {
Clusters.query(function (clusters) {
$scope.clusters = clusters;
});
};
}]);
我正在编写我的单元测试,我发现的每个示例都使用某种形式的 $httpBackend.expect 来模拟来自服务器的响应,我可以做到这一点。
我的问题是,在对控制器功能进行单元测试时,我想模拟 Clusters 对象。如果我使用$httpBackend.expect,并且我在我的工厂中引入了一个错误,我的控制器中的每个单元测试都会失败。
我想让我的$scope.create 测试只测试$scope.create 而不是我的工厂代码。
我尝试在测试的beforeEach(module('mean', function ($provide) { 部分添加提供程序,但我似乎无法做到。
我也试过
clusterSpy = function (properties){
for(var k in properties)
this[k]=properties[k];
};
clusterSpy.$save = jasmine.createSpy().and.callFake(function (cb) {
cb({_id: '1'});
});
并在before(inject 中设置Clusters = clusterSpy;,但在创建函数中,间谍迷路了
错误:预期是间谍,但得到了函数。
我已经能够让一个间谍对象为 cluster.$update 类型调用工作,但随后它在 var cluster = new Clusters(); 处失败并出现“不是函数”错误。
我可以创建一个适用于 var cluster = new Clusters(); 的函数,但对于 cluster.$update 类型的调用会失败。
我可能在这里混淆了术语,但是,有没有一种适当的方法来模拟具有间谍功能的集群,或者是否有充分的理由只使用$httpBackend.expect?
【问题讨论】:
标签: javascript angularjs unit-testing jasmine