如何对 AngularJS $promise.then 进行单元测试

Posted

技术标签:

【中文标题】如何对 AngularJS $promise.then 进行单元测试【英文标题】:How to unit test AngularJS $promise.then 【发布时间】:2014-04-06 21:20:15 【问题描述】:

我有一个使用 Angular 资源进行 API 调用的工厂。然后我创建了一个名为 getAllResources 的函数,并使用工厂来查询我的所有数据。然后在我的控制器中,我使用该服务和 $promise.then 来获取我的数据并将其存储在一个变量中。

这是在咖啡脚本中。如何对此进行单元测试:

工厂:

resource "/perm/api/account/:uid/svcs",
      uid: "@uid"
    ,
      query:
        cache: true
        isArray: true
        method: "GET"

服务:

getAllResources: (uid) ->
      factory.query(uid: uid)

Ctrl:

model.getAllResources(scope.accountID).$promise.then ((response) ->
      scope.allResources = response
      resPromise.resolve()
    ), (error) ->
      log.debug error
      state.go "pageunavailable"

我正在尝试通过以下方式对此进行测试:

在每个之前:

var def, model, service;
service = $injector.get("Service");
    model = 
    getAllResources: function() 
      def = q.defer();
      return def.promise;
    
  ;


  controller("Ctrl", 
      $scope: scope, 
      model: model
    , service);

它():

fakeProfSvcsData = [id:0,name:"zeon",id:1,name:"leo"];
spyOn(model, "getAllResources").andCallThrough();
def.resolve(fakeProfSvcsData);
scope.$digest()

expect(scope.allResources).toEqual(fakeProfSvcsData);

【问题讨论】:

【参考方案1】:

我通过修改以下代码修复了它:

服务:

getAllResources: (uid) ->
      factory.query(uid: uid).$promise

Ctrl:

model.getAllResources(scope.accountID).then ((response) ->
      scope.allResources = response
      resPromise.resolve()
    ), (error) ->
      log.debug error
      state.go "pageunavailable"

它():

fakeProfSvcsData = [id:0,name:"zeon",id:1,name:"leo"];
spyOn(model, "getAllResources").andReturn(def.resolve(mockProfSvcsData));
def.resolve(fakeProfSvcsData);
scope.$digest()

expect(scope.allResources).toEqual(fakeProfSvcsData);

【讨论】:

以上是关于如何对 AngularJS $promise.then 进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

AngularJs:如何对指令创建的动态元素应用表单验证

如何在 AngularJS2“final”中对组件进行单元测试?

如何使用 AngularJS 对多个对象应用过滤器?

如何存储对变量的http angularjs调用响应

如何对 AngularJS $promise.then 进行单元测试

如何使用 AngularJs 对对象数组中的属性值求和