首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mocha - TypeError:无法读取未定义的属性“$scope”

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

Stack Overflow用户
提问于 2016-11-18 13:32:45
回答 1查看 995关注 0票数 1

我发现了一个错误:

TypeError:无法读取未定义的属性“$scope”

代码语言:javascript
运行
复制
 at $controller (bower\_components/angular/angular.js:10327:28)
代码语言:javascript
运行
复制
 at bower\_components/angular-mocks/angular-mocks.js:2221:12
代码语言:javascript
运行
复制
 at Context. (src/client/app/peer-review/post-visit.controller.spec.js:11:18)

当使用摩卡和业力在angularJS控制器上运行测试时。

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

代码语言:javascript
运行
复制
    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,而且在同一个模块中的其他控制器上的测试也通过得很好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-18 13:33:41

这是一个误导性错误。

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

代码语言:javascript
运行
复制
    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);
      }

如果它在数组中找不到控制器,它会运行一个getter,尝试从‘局部变量’(可以是null)中读取$scope。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40678432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档