AngularJS模拟自执行控制器

时间:2014-05-09 06:35:24

标签: javascript angularjs unit-testing backbone.js angular-mock

如何防止具有自我实例化功能的角度控制器执行测试?

(我用一个人为的例子来说明我的问题)

我有一个控制器在启动时执行一些代码(在我的例子中是ajax)

var app = angular.module('app', []);
app.controller('myCtrl', function () {
    this.doSomething = function () {
        console.log('nahh');
    };

    this.doSomething();
});

我正在尝试为控制器编写测试。我不想要 doSomething 来执行。

var ctrl = $controller('myCtrl',
{
    $scope: {}
});
// ctrl.doSomething has already run!

expect(something).to.be(true);

当使用backbone.js时,我会做类似的事情:

MyCtrl.prototype.doSomething = function(){};
myCtrl = new MyCtrl();

我在初始化之前修改原型以防止执行。 $ controller似乎给了我一个控制器的实例。能够获得原型是有用的。我可能还有其他方法可以解决这个问题!

1 个答案:

答案 0 :(得分:1)

正如我在评论中提到的,我通过将我的初始化代码放在init函数中解决了这个问题。然后,当它在dom上时,我使用ng-init来启动此代码。这允许我在代码中测试控制器而不启动它。

JS:

$scope.init = function() {
  doSomething();
};

HTML:

<div ng-controller="myController" ng-init="init()">