在我的Angular应用程序中,我的controller
定义如下:
angular.module('myApp.controllers')
.controller('AppController', function($rootScope, $scope, CheckResource) {
$scope.check = function(data) {
var promise = CheckResource.query(data).$promise;
promise.then(function(result) {
$scope.value = result;
}, function() {
$scope.value = "default";
});
};
};
我的CheckResource
是Factory
,如下所示:
angular.module('myApp.services', ['ngResource'])
.factory('CheckResource', function($resource) {
return $resource('/check', {}, {
query: {
method: 'POST'
}
});
});
我想为我的控制器AppController
编写一个单元测试,并以某种方式模拟我的工厂CheckResource
,但我不知道如何使用$q
来实现这一目标和延期承诺。任何人都可以向我解释一下这种情况会发生什么?
我有什么选择来测试这种情况?我应该嘲笑我的服务吗?我应该使用spyOn
吗?我应该使用$httpBackend
吗?或者,我应该进行E2E测试吗?
答案 0 :(得分:0)
假设你的测试中有一个模拟器,你可以这样做:
var deferred;
beforeEach(inject(function($q) {
deferred = $q.defer();
myController.CheckResource = {
query: function() {
return {$promise: deferred.promise};
}
};
}));
然后在你的测试中:
it('tests CheckResource', function() {
deferred.resolve([]);
expect(something).toHaveHappened();
});
答案 1 :(得分:-1)
ngResource在单独的模块中定义。请查看文档http://docs.angularjs.org/api/ngResource换句话说,您必须在MyApp.Factory模块中包含和添加ngResource依赖项 - angular.module(“MyApp.Factory”,[“ngResource”])
var factory;
beforeEach(function () {
module("MyApp.Factory");
inject(function (_factory_) {
factory = _factory_;
});
});