我面对的是我认为非常简单的场景,但我找不到一个明确的答案:我有一个控制器在创建时做了很多事情,包括一些复杂的东西,所以我创建了一个初始化函数这样做。
这是控制器代码的样子:
function MyCtrl() {
function init() {
// do stuff
}
var vm = this;
vm.init = init;
vm.init();
}
显然,我想单元测试init(),但我找不到这样做的方法:当我在我的测试中实例化控制器时,init()运行一次,这使得很难正确测试它的侧面 - 当我第二次运行它时会产生影响。
我正在使用karma-jasmine进行测试,通常做这样的事情:
describe('Controller: MyCtrl', function () {
var myCtrl;
beforeEach(angular.mock.module('myApp'));
beforeEach(inject(function ($controller, $rootScope) {
$scope = $rootScope.$new();
createController = function () {
return $controller('MyCtrl', {$scope: $scope});
};
}));
it('bleh', function() {
myCtrl = createController();
// init has already been run at that point
});
)};
同样,我确信它真的很简单,我只是忽略了这一点,但我仍然是Angular的新手。非常感谢你的帮助!
答案 0 :(得分:1)
将JB Nizet的答案放在这里而不是评论中。
非常感谢您的回答!
这是鸡和蛋的问题:构造函数调用init,你需要调用构造函数来调用你的init函数。我仍然认为你有一个或几个由构造函数调用的“私有”函数的事实是一个实现细节。你真正想要测试的是构造函数完成它的工作。您可以通过委托服务功能(可以进行单元测试,并在测试控制器时进行模拟)来简化这一过程。