1
我面临的是我相信一个非常简单的场景,但我找不到一个明确的答案:我有一个控制器,它在创建时会执行一些操作,包括有些复杂的东西,所以我创建了一个初始化函数来完成它。单元测试一个角度控制器的初始化函数
这里的控制器代码如下所示:
function MyCtrl() {
function init() {
// do stuff
}
var vm = this;
vm.init = init;
vm.init();
}
很明显,我想单元测试的init(),但我不能找到一种方法,这样做:当我实例化在我的测试控制器时,init ()运行一次,这使得我第二次运行它时很难正确测试它的副作用。
我使用卡玛茉莉的测试,通常做这样的事情:
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来说,它还是相当新的。非常感谢你的帮助!
那么,createController()调用init()。所以,只要测试一下调用createController()就可以做它应该做的事情,即正确地完成了“完成的事情”。 –
感谢您的回答! 我的问题是,它不仅仅是被调用的init()。另外,我简化了我的示例,但可能会有几个不同的“init”函数,这样就可以独立测试它们的逻辑。 (顺便说一句,有点偏题:我很喜欢你的诺言教程,它真的很棒,帮了很大忙,所以谢谢!) – Augustin
这是一个鸡和鸡蛋问题:init由构造函数调用,而你需要调用构造函数来调用你的init函数。我仍然认为,你有一个或几个由构造函数调用的“私有”函数是一个实现细节。你真正想测试的是构造函数完成它的工作。您可以通过委托服务功能(可以进行单元测试,并在测试控制器时进行模拟)来简化这一点。 –