Angular karma test:TypeError readonly属性

时间:2014-03-03 20:50:18

标签: javascript angularjs karma-runner

我正试图在我的控制器测试中模拟这个'usermanager'提供程序,但我总是得到这个错误

TypeError: Attempted to assign to readonly property.
at workFn (c:{...}/bower_components/angular-mocks/angular-mocks.js:2105)

这是我的控制器:

angular.module('sasApp')
.controller('RegisterCtrl', function ($scope, usermanager) {

  // variables
  $scope.captcha = {};

  // Get captcha from server
  usermanager.getCaptcha().then(function (captcha) {
    $scope.captcha = captcha;
  }, function (reason) {
    console.log('Failed: ' + reason);
  });
});

这是我的测试:

describe('Controller: RegisterCtrl', function () {
  // load the controller's module
  beforeEach(module('sasApp'));

  var RegisterCtrl,
      scope,
      mockUsermanager;

  mockUsermanager = {
    getCaptcha: function () {
      return {
        test: 1
      };
    }
  };

  // Initialize the controller and a mock scope
  beforeEach(inject(function ($controller, $rootScope) {
    scope = $rootScope.$new();
    RegisterCtrl = $controller('RegisterCtrl', {
      $scope: scope,
      usermanager: mockUsermanager
    });
  }));

  describe('Initialization', function () {

    it('should have \'captcha\' object defined', function () {
      expect(scope.captcha).toBeDefined();
    });
  });
});

问题是,在我尝试设置'usermanager'提供程序的模拟之前,我没有收到此错误。如果我在beforeEach语句中删除'usermanager:mockUsermanager'行,那么它运行良好。

你能发现什么是错的吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

这可能不是最好的答案,但我已经制作了一个不会在这里重现问题的Plnkr: http://plnkr.co/GgUeKnsvxEHmD3Wcyocx?p=preview

快速说明: usermanager.getCaptcha()必须返回一个承诺,否则当它尝试调用.then时,下一部分测试会爆炸。所以我只是假装了一个。

如果您发现任何差异,请告诉我(例如,我不知道您所使用的角度版本)。我可以看到更新