【问题标题】:AngularJS Mock Self Executing ControllerAngularJS 模拟自执行控制器
【发布时间】:2014-05-09 06:35:24
【问题描述】:

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

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

我有一个控制器在启动时执行一些代码(在我的例子中是 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 似乎给了我一个控制器的实例。能够获得原型会很有用。可能还有其他方法可以克服这个我不知道的!

【问题讨论】:

  • 我绕过它的一种方法是在 dom 元素上使用 ng-init 来引导。这样它就不会在代码中引导。 js app.controller('myCtrl', function () { $scope.doSomething = function () { console.log('nahh'); }; }); HTML <div ng-controller="myCtrl" ng-init="doSomething()">
  • 实际上你可以在 Ctrl 原型中添加 doSomething 函数(有些人甚至会说你最好这样做以获得更好的性能)。如果您将注册一个对象传递给控制器​​,而不是匿名函数,那么您不仅可以向该对象的原型添加您需要的方法。

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


【解决方案1】:

正如我在评论中提到的,我通过将我的初始化代码放在 init 函数中解决了这个问题。然后我使用ng-init 在 dom 上启动此代码。这让我可以在代码中测试控制器,而无需它自己启动。

JS:

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

HTML:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 2015-03-15
    • 2015-07-14
    • 2016-04-09
    相关资源
    最近更新 更多