【发布时间】: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