我正在尝试测试使用angular的$ resource的控制器。
function PermissionsCtrl($scope, $resource, $cookies) {
var Object = $resource('/v1/objects/:id');
loadObjects();
function loadObjects() {
$scope.myAppObjects = new Array();
var data = AppObject.get({find: '{"app_id": '+wtm.app_id+'}'},
function(){
if (data.results) {
for(var i = 0; i< data.results.length; i++) {
if(!data.results[i].is_deleted) {
(function(i){
$scope.objects(data.results[i]);
}(i));
}
}
}
},
function(error){console.log(error);});
}
这是测试代码。
var apiServer = "...";
var app_id = 999
var mock_object_data = {...};
describe('apps permissionsCtrl', function(){
var scope, ctrl, $httpBackend;
// Create a matcher for comparing data
beforeEach( function() {
this.addMatchers({
toEqualData: function(expected) {
return angular.equals(this.actual, expected);
}
});
});
// Create the controller with injected data/services
beforeEach(inject(function(_$httpBackend_, $rootScope, $controller, $resource) {
$httpBackend = _$httpBackend_;
// cookie data to inject
var cookies = new Array();
cookies['id'] = '...'; // just needs to be declared
$httpBackend.expectGET(apiServer+'/v1/app_objects? find=%7B%22app_id%22:'+app_id+'+%7D&access_token=' + cookies['id'])
.respond( mock_object_data );
var $injector = angular.injector(['ng', 'ngResource']);
var $resource = $injector.get('$resource');
scope = $rootScope.$new();
ctrl = $controller(PermissionsCtrl, {$scope: scope, $cookies: cookies, $resource: $resource});
}));
it('should put object data into $scope', function() {
$httpBackend.flush();
expect(scope.objects).toEqualData( mock_object_data );
}); });
当我跑步时,我得到了
Error: Unknown provider: $resourceProvider <- $resource
在我尝试创建控制器的行。我不明白如何将它注入我的控制器,无论我尝试什么,我都会得到同样的错误。我尝试了几件事
答案 0 :(得分:7)
经过更多的阅读和更多的实验,似乎正确的方法是从控制器中抽象出$ resource的使用。在我的情况下,我编写了一个依赖于$ resource的服务,然后将该服务注入我的控制器。同时我与我的控制器分开测试该服务。更好地练习四周。
我的服务声明:
angular.module('apiModule', ['localResource', 'ngCookies'])
.factory('apiService', function($resource, $cookies) {
在我的单元测试中,我将它传递给beforeEach设置函数
beforeEach(module('apiModule'));
答案 1 :(得分:6)
尝试使用以下代码实例化$resource
:
var $injector = angular.injector(['ng', 'ngResource']);
var $resource = $injector.get('$resource');
类似于其他服务,除非它们仍处于其他模块中。然后将该模块添加到数组中。