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

时间:2016-12-15 17:54:35

标签: javascript angularjs mocha karma-runner

我试图在我的Mocha测试中实例化我的控制器(使用Karma作为跑步者)以测试一些控制器方法。我正在关注类似Angular ES6 Webpack setup的内容。

这是我尝试的内容:

// 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';

  }
}

// 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();

    });
  });
});

所以,当我做new Controller()时,它期望$timeout作为参数传递给构造函数(它应该是依赖注入),我可以&#39 ;弄清楚如何传递someData绑定。

如果我尝试$componentController(按Angular 1.5 component docs推荐),我会收到这个奇怪的错误:

compileProvider.preAssignBindingsEnabled is not a function

所以,我查找了这个方法$compileProvider.preAssignBindingsEnabled,并尝试在我的模块配置中将其设置为truefalse,但它仍然会说它不是功能。所以我已经走到了尽头。

关于如何实例化我的控制器以将其用于测试的任何想法?

1 个答案:

答案 0 :(得分:6)

您使用的是哪种角度?遇到了同样的问题,事实证明我的角度为1.5.7,角度为1.5.10。 将角度模拟放置到1.5.7(相同版本的角度)修复了问题。 preAssignBindingsEnabled已添加到1.5.10 例如:https://github.com/angular/angular.js/blob/master/CHANGELOG.md