Mocha - TypeError:无法读取属性' $ scope'未定义的

时间:2016-11-18 13:32:45

标签: javascript angularjs karma-mocha

我收到错误:

TypeError:无法读取属性' $ scope'未定义的     在$ controller(bower_components / angular / angular.js:10327:28)
    在bower_components / angular-mocks / angular-mocks.js:2221:12
    在上下文。 (SRC /客户端/应用程序/同行审查/后visit.controller.spec.js:11:18)

使用mocha和karma在angularJS控制器上运行测试时。

它试图运行的测试的初始化是:

    describe('PostVisitController', function () {
      var controller;

      beforeEach(function () {
        bard.appModule('app.peer-review');
        bard.inject('$controller', '$log');
        controller = $controller('PostVisitController');
      });

      bard.verifyNoOutstandingHttpRequests();

      it('should be created successfully', function () {
        expect(controller).to.be.defined;
      });
    });

它正在测试的控制器不需要$ scope,并且同一模块中其他控制器的测试正在通过。

1 个答案:

答案 0 :(得分:2)

这是一个误导性错误。

当实例化控制器时,angular运行以下代码(来自angular.js),该代码检查控制器是否在它所定义的控制器列表中:

    return function $controller(expression, locals, later, ident) {
      var instance, match, constructor, identifier;
      later = later === true;
      if (ident && isString(ident)) {
        identifier = ident;
      }

      if (isString(expression)) {
        match = expression.match(CNTRL_REG);
        if (!match) {
          throw $controllerMinErr('ctrlfmt',
            "Badly formed controller string '{0}'. " +
            "Must match `__name__ as __id__` or `__name__`.", expression);
        }
        constructor = match[1],
        identifier = identifier || match[3];
        expression = controllers.hasOwnProperty(constructor)  <———————— HERE
            ? controllers[constructor]
            : getter(locals.$scope, constructor, true) ||
                (globals ? getter($window, constructor, true) : undefined);

        assertArgFn(expression, constructor, true);
      }

如果在数组中找不到控制器,它会运行一个试图从'locals'变量读取$ scope的getter(可以为null)。

如果测试的索引文件中未包含控制器,则控制器不在数组中。包含该文件将解决问题。