gpt4 book ai didi

unit-testing - 使用资源服务测试 AngularJS Controller

转载 作者:行者123 更新时间:2023-12-05 01:08:37 24 4
gpt4 key购买 nike

背景:
我正在为 angular js Controller 编写单元测试,该 Controller 利用包装在服务中的 angular $resources(出于可维护性目的)。

示例 Controller :

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...
])

Angular 中的大多数单元测试示例都建议使用 $httpBackend,从而在 Controller 中模拟 $http 服务。老实说,我怀疑这是否是一种好习惯,因为如果这样做,我必须在所有 Controller 测试中对请求路径进行硬编码,并且我想隔离单元行为。 $httpBackend mock 非常棒,但前提是您直接在 Controller 中使用 $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

如果我创建了一个模拟用户资源类实例,例如:
angular.module('app.services.Users', [])
.factory 'Users', ->
class Users
$save:(cb)->
$remove:->
@query:->
@get:->

Angular DI机制将以透明的方式覆盖旧的“app.services.Users”模块,并使我能够对 Jasmine spy 进行检查。

困扰我的是我无法找到一个支持我的想法的例子。所以问题是,你会使用哪一个,为什么或我做错了什么?

最佳答案

正如您所建议的,我认为使用 Jasmine spy 在服务级别上 stub 更有意义。此时您是在对 Controller 进行单元测试,而不是对服务进行单元测试——发出 http 请求的确切方式不应成为此测试的关注点。

你可以在你的规范中做这样的事情:

var Users = jasmine.createSpyObj('UsersStub', ['query', 'get']);
beforeEach(inject(function($provide) {
$provide.factory('Users', function(){
return Users;
});
});

然后在您的相关测试中,您可以对各个服务方法进行 stub ,以在您的 spy 对象上使用诸如“andCallFake”之类的方法返回您期望的内容。

关于unit-testing - 使用资源服务测试 AngularJS Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16958203/

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