使用 "controller as"语法的 AngularJS Controller 单元测试

标签 angularjs unit-testing controller jasmine karma-runner

我在适应方面遇到了一些麻烦 this test使用“ Controller 为”语法。这是我所拥有的...

我正在测试的 Controller 是:

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 .

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

预先感谢您提出的任何建议。

最佳答案

除了fakePwsService != fakeService @JBNizet 指出的。

$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 .

附注。此问题与“ Controller 为”语法无关。

关于使用 "controller as"语法的 AngularJS Controller 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25315130/

相关文章:

unit-testing - 开发后测试的陷阱是什么?

mysql - 在 Controller 的存储方法中添加两个查询

javascript - 如何正确地与另一个 Controller 管理的 View 交互?

javascript - 使用 Jasmine 测试 ajax 请求内的 Angular 范围变量

angularjs - ng-repeat 中的 ng-class : conditional class names depending on the item parameters

javascript - 具有双向绑定(bind)的隔离范围指令不反射(reflect) Controller 范围的变化

c++ - 验证并验证 NoMoreInteractions 到 gtest

c++ - CppUnitTestFramework 和测试 "vector subscript out of range"

javascript - 搜索时分页未更新

php - Laravel Controller 路由/带有 GET 参数的操作