【问题标题】:How to test with Jasmine an AngularJS controller that calls service method that returns promise如何使用 Jasmine 测试调用返回承诺的服务方法的 AngularJS 控制器
【发布时间】:2013-11-03 00:13:10
【问题描述】:

我正在使用 v1.2.0-rc.3 的 AngularJS 和 Jasmine 测试框架。

我试图断言控制器调用了服务方法。服务方法返回一个承诺。控制器如下所示:

angular.module('test', [])
.controller('ctrl', ['$scope', 'svc', function ($scope, svc) {
  $scope.data = [];
  svc.query()
  .then(function (data) {
    $scope.data = data;
  });
}]);

我想测试当服务方法的 deferred 被解决时,数据是否被分配给了作用域。我为该服务创建了一个模拟,单元测试如下所示:

describe('ctrl', function () {
  var ctrl, scope, svc, def, data = [{name: 'test'}];
  beforeEach(module('test'));
  beforeEach(inject(function($controller, $rootScope, $q) {
    svc = {
      query: function () {
        def = $q.defer();
        return def.promise;
      }
    };
    scope = $rootScope.$new();
    controller = $controller('ctrl', {
      $scope: scope,
      svc: svc
    });
  }));
  it('should assign data to scope', function () {
    spyOn(svc, 'query').andCallThrough();
    deferred.resolve(data);
    scope.$digest();
    expect(svc.query).toHaveBeenCalled();
    expect(scope.data).toBe(data);
  });
});

我希望调用 svc 的查询方法,但显然没有。

我按照 this 指南在单元测试中模拟 Promise。

我做错了什么?

【问题讨论】:

    标签: angularjs jasmine


    【解决方案1】:

    看来我把我的间谍放在了错误的地方。当我把它放在 beforeEach 中时,测试通过了。

      beforeEach(inject(function($controller, $rootScope, $q) {
        svc = {
          query: function () {
            def = $q.defer();
            return def.promise;
          }
        };
        spyOn(svc, 'query').andCallThrough();
        scope = $rootScope.$new();
        controller = $controller('ctrl', {
          $scope: scope,
          svc: svc
        });
      }));
    

    【讨论】:

    • 特别注意 spyOn() 结束时的“andCallThrough”调用。
    • 您的控制器在实例化时调用服务方法,因此您必须在调用 $controller 之前监视该服务方法。
    • 你能展示完整的工作示例吗?我不能让这东西工作! : / 我用上面的方法尝试了很多不同的东西,但一切都返回 undefined
    猜你喜欢
    • 2014-05-19
    • 2016-06-17
    • 2014-06-17
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 2016-07-27
    • 2017-06-03
    • 1970-01-01
    相关资源
    最近更新 更多