角度指令测试在包裹IIFE后失败

时间:2016-01-26 06:04:39

标签: javascript angularjs

在阅读John Papa的AngularJS style guide on IIFEs后,我开始将所有文件包装在IIFE中。当我将我的菜单指令文件包装在IIFE中时遇到了问题。测试失败声称我的菜单指令的控制器未定义。

  

ReferenceError:未定义MenubarController           在对象。 (/Users/eso/dev/Prismo/frontend/prismo-frontend/app/menubar/directives_test.js:9:2473)           at Object.invoke(/Users/eso/dev/Prismo/frontend/prismo-frontend/app/bower_components/angular/angular.js:9:139719)           at Object.workFn(/Users/eso/dev/Prismo/frontend/prismo-frontend/app/bower_components/angular-mocks/angular-mocks.js:9:69713)       TypeError:无法读取未定义的属性'loadCurrentUser'           在对象。 (/Users/eso/dev/Prismo/frontend/prismo-frontend/app/menubar/directives_test.js:9:3634)       错误:未刷新的请求:1           在函数。$ httpBackend.verifyNoOutstandingRequest(/Users/eso/dev/Prismo/frontend/prismo-frontend/app/bower_components/angular-mocks/angular-mocks.js:9:45282)           在对象。 (/Users/eso/dev/Prismo/frontend/prismo-frontend/app/menubar/directives_test.js:9:2853)

我的代码太长了,无法在此发布;我已经提供了github repo commit的链接:

Menubar directives.js file

测试在IIFE之前通过,但在添加IIFE后失败。然而,其他测试通过了;所有其他控制器,服务等,即使在添加IIFE之后。有什么想法吗?

编辑:请注意,构建应用程序并部署它会导致应用程序没有错误。菜单指令呈现并按预期工作。

1 个答案:

答案 0 :(得分:1)

由于该指令包含在iife上,因此您无法访问MenubarController对象on the test。改为使用字符串:

ctrl = controller('MenubarController', deps, data);

在指令文件中,您必须在角度模块中注册具有相同名称的控制器,并将其按字符串添加到指令中:

.directive('menubar', function() {
    return {
      templateUrl: 'menubar/menubar.html',
      restrict: 'E',
      scope: {},
      bindToController: {
        appname: '=',
        tabs: '='
      },
      controller: 'MenubarController',
      controllerAs: 'vm'
    };
  })
  .controller('MenubarController', MenubarController)