unit-testing – 使用资源服务测试AngularJS控制器
发布时间:2020-12-17 17:18:15 所属栏目:安全 来源:网络整理
导读:背景: 我正在为angular js控制器编写单元测试,它使用包含在服务中的角度$资源(用于可维护性目的). 示例控制器: name = 'app.controllers.UsersIndexCtrl'angular.module(name,[]).controller(name,[ '$scope' '$location' '$dialog' 'Users' 'UserRoles' (
背景:
我正在为angular js控制器编写单元测试,它使用包含在服务中的角度$资源(用于可维护性目的). 示例控制器: name = 'app.controllers.UsersIndexCtrl' angular.module(name,[]) .controller(name,[ '$scope' '$location' '$dialog' 'Users' 'UserRoles' ($scope,$location,$dialog,Users,UserRoles) -> # Get users list $scope.users = Users.query() # rest... ]) 示例资源服务: angular.module('app.services.Users',[]) .factory 'Users',['$rootScope','$http','$resource','$location',($rootScope,$http,$resource,$location)-> baseUrl = '/users' Users = $resource baseUrl + '/:userId',{userId: '@_id'} Users.getStatus = -> console.log 'User::getStatus()' req = $http.get baseUrl + '/status' req.success (res)-> $rootScope.globalUserAccountSettings = res unless $rootScope.$$phase then $rootScope.$apply() # other,custom methods go here... ]) 大多数单元测试示例使用$httpBackend进行角度建议,从而模拟控制器中的$http服务.说实话,我怀疑这是否是一个好习惯,因为如果这样做我必须在所有控制器测试中硬编码请求路径,我想隔离单元行为. $httpBackend mock非常棒,但前提是你直接在控制器中使用$resource. 使用$httpBackend的典型单个测试看起来像: it 'should be able to add a new empty user profile',-> $httpBackend.flush() l = $scope.users.length $httpBackend.expect('POST','/users').respond _.cloneDeep mockResponSEOK[0] $scope.add() $httpBackend.flush() expect($scope.users.length).toEqual l + 1 如果我创建了一个模拟User资源类实例,例如: angular.module('app.services.Users',-> class Users $save:(cb)-> $remove:-> @query:-> @get:-> Angular DI机制将以透明的方式覆盖旧的“app.services.Users”模块,并使我能够使用茉莉花间谍运行检查. 困扰我的是我无法找到支持我的想法的单一例子.所以问题是,你会使用哪一个,为什么或我做错了什么? 解决方法
我认为如你所建议的那样,使用Jasmine间谍将其存储在服务级别更有意义.此时您正在对控制器进行单元测试,而不是服务 – 确定http请求的确切方式不应该是此测试的关注点.
您可以在您的规范中执行以下操作: var Users = jasmine.createSpyObj('UsersStub',['query','get']); beforeEach(inject(function($provide) { $provide.factory('Users',function(){ return Users; }); }); 然后在您的相关测试中,您可以使用间谍对象上的“andCallFake”等方法来存储各个服务方法以返回您期望的内容. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |