【问题标题】:AngularJS controller unit test using the "controller as" syntaxAngularJS 控制器单元测试使用“controller as”语法
【发布时间】:2014-10-08 12:32:51
【问题描述】:

我在调整 this test 以使用“controller as”语法时遇到了一些问题。这就是我所拥有的......

我正在测试的控制器是:

function MyCtrl ($scope, someService) {
  someService.get()
  .success(function(data){
    $scope.person = data;
  });
 }
angular.module('myApp')
.controller('MyCtrl', MyCtrl);

单元测试是:

beforeEach(module('myApp'));

  var scope,
    fakeService, 
    controller, 
    q, 
    deferred;

  beforeEach(function () {
      fakeService = {
          get: function () {
              deferred = q.defer();
              deferred.resolve({ "test": "data" });
              return deferred.promise;
          }
        };
      spyOn(fakeService, 'get').and.callThrough();
  });

  beforeEach(inject(function ($controller, $q, $rootScope) {
      q = $q;
      scope = $rootScope.$new();
      controller = $controller('MyCtrl as person', { $scope: scope, someService: fakeService });
  }));

  it('The person object is not defined yet', function () {
      expect(scope.person).not.toBeDefined();
  });

scope.person 的此测试失败并出现错误 TypeError: undefined is not a function

我尝试了this solution,将expect(scope.person) 更改为expect(scope),但返回TypeError: undefined is not a function

我正在使用 AngularJS 1.2.22、Karma 0.12.21 和 0.2.2 的 karma-jamsine 插件。

提前感谢您提出的任何建议。

【问题讨论】:

  • fakePwsService != fakeService
  • 已编辑以修复 fakePwsService != fakeService 错字

标签: angularjs unit-testing controller jasmine karma-runner


【解决方案1】:

除了@JBNizet 指出的fakePwsService != fakeService

$q.defer() 创建的 promise 没有 success() 方法。

.success().error() 方法是 $http 服务本身添加的特殊方法。

因此,如果您想以这种方式模拟someService,您还必须自己模拟.success()

fakePwsService = {
  get: function () {
    deferred = q.defer();
    deferred.resolve({ "test": "data" });

    var promise = deferred.promise;

    promise.success = function(fn) {
      promise.then(function(response) {
        fn(response.data, response.status, response.headers, config);
      });
      return promise;
    };

    promise.error = function(fn) {
      promise.then(null, function(response) {
        fn(response.data, response.status, response.headers, config);
      });
      return promise;
    };

    return promise;
  }
};

以上代码复制自http.js#L743

PS。此问题与“controller as”语法无关。

【讨论】:

  • 感谢您的注释:“控制器为”语法。
  • 如果我将$controller('PwsCtrl as person', { $scope: scope, pwsService: fakePwsService }) 更改为$controller('PwsCtrl', { $scope: scope, pwsService: fakePwsService }),则此答案有效。是否可以使用“as”语法运行此测试?
  • 有什么错误吗?可能是因为你的断言语句不正确,应该是expect(scope.person).toBeDefined();。看到这个plunker
猜你喜欢
  • 1970-01-01
  • 2015-02-02
  • 2016-09-20
  • 2014-04-12
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多