gpt4 book ai didi

unit-testing - 如何在 Jasmine 测试中模拟 Angular $resource

转载 作者:行者123 更新时间:2023-12-04 02:47:36 25 4
gpt4 key购买 nike

我正在尝试测试一个使用 Angular 的 $resource 的 Controller 。

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

在我尝试创建 Controller 的那一行。我不明白如何将它注入(inject)我的 Controller ,无论我尝试什么,我都会得到同样的错误。我尝试过的几件事是
  • 声明一个空的模拟对象并将其传递给类似于我的 cookies 变量。我认为这可能是一个糟糕的解决方案,因为我实际上想使用该服务。
  • 模仿范围模拟并将其传递给我的注入(inject)函数并将 $resource.$new() 传递给我的 Controller 。
  • 什么都不做,并希望 httpBackend 能够覆盖它,因为无论如何最终都会调用它。 Vojta Jína 说这听起来可行,但没有骰子。
  • 温和的绰号。令人满意但不是很有效。
  • 最佳答案

    经过更多的阅读和更多的实验,似乎正确的方法是从 Controller 中抽象出 $resource 的使用。就我而言,我编写了一个依赖于 $resource 的服务,然后将该服务注入(inject)到我的 Controller 中。同时,我与 Controller 分开测试该服务。更好地练习四周。

    我的服务声明:

    angular.module('apiModule', ['localResource', 'ngCookies'])
    .factory('apiService', function($resource, $cookies) {

    在我的单元测试中,我在 beforeEach 设置函数中通过它
    beforeEach(module('apiModule'));

    关于unit-testing - 如何在 Jasmine 测试中模拟 Angular $resource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14242302/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com