如何在Karma / Mocha测试套件中测试Angular 1.5控制器?

Jos*_*eam 0 javascript mocha.js angularjs karma-runner

我正在尝试在Mocha测试中实例化控制器(使用Karma作为运行程序),以测试某些控制器方法。我正在遵循与此Angular ES6 Webpack设置类似的内容

这是我正在尝试的:

// controller.js

// also, the component that uses this controller
// declares some bindings, like "someData: '<'"

export default class SomeController {
  // notice the injection
  constructor($timeout) {

    // uses ng-annotate
    'ngInject';

  }
}
Run Code Online (Sandbox Code Playgroud)

// test.spec.js (same dir as controller)

import SomeController from './controller.js'

describe('MyComponent', () => {
  let $rootScope;
  let $componentController;
  let $timeout;
  let makeController;

  beforeEach(window.module('app'));

  beforeEach(inject((_$componentController_, _$timeout_) => {
    $componentController = _$componentController_;
    $timeout = _$timeout_;
    makeController = () => {
      // I've tried the 2 options below
      // return new Controller($timeout)
      // return $componentController('myComponent', { $timeout }, { someData: [] });
    };
  }));

  describe('Controller', () => {
    it('does something', () => {

      // FAILS HERE

      $ctrl = makeController();

    });
  });
});
Run Code Online (Sandbox Code Playgroud)

因此,当我这样做时new Controller(),它希望$timeout作为构造函数的参数传递(应该是依赖注入),而我不知道如何传递someData绑定。

如果我改为尝试$componentController(按照Angular 1.5 component docs的建议),则会收到此奇怪的错误:

compileProvider.preAssignBindingsEnabled is not a function
Run Code Online (Sandbox Code Playgroud)

所以,我抬头一看这个方法$compileProvider.preAssignBindingsEnabled,并试图将它设置为两个true,并false在我的模块配置,但它仍然抛出说这是不是一个函数。所以我已经死胡同了。

关于如何实例化控制器以进行测试的任何想法?

小智 6

您使用的是哪个版本的angular?遇到了同样的问题,结果发现我有1.5.7的角度和1.5.10的角度模拟。将角球设置为1.5.7(角球的相同版本)可解决此问题。preAssignBindingsEnabled已在1.5.10上添加,例如:https : //github.com/angular/angular.js/blob/master/CHANGELOG.md