加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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”等方法来存储各个服务方法以返回您期望的内容.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读