【发布时间】:2016-06-14 22:29:30
【问题描述】:
我面临着一个我认为非常简单的场景,但我找不到明确的答案:我有一个控制器,它在创建时会做很多事情,包括一些复杂的事情,所以我创建了一个初始化函数去做吧。
控制器代码如下所示:
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 还是很陌生。非常感谢您的帮助!
【问题讨论】:
-
好吧,createController() 调用 init()。因此,只需测试调用 createController() 是否完成了它应该做的事情,即正确地“完成了一些事情”。
-
感谢您的回答!我的问题是它不仅被调用了 init() 。另外,我简化了我的示例,但可能有几个不同的“init”函数,正是为了使它们的逻辑可以独立测试。 (顺便说一句,有点跑题了:我很喜欢你关于 Promise 的教程,它真的很棒而且帮助很大,所以谢谢你!)
-
这是一个先有鸡还是先有蛋的问题:init 由构造函数调用,您需要调用构造函数才能调用您的 init 函数。我仍然认为,构造函数调用一个或多个“私有”函数这一事实是一个实现细节。您真正想要测试的是构造函数是否完成了它的工作。您可以通过委派服务功能来简化它(可以进行单元测试,并在测试控制器时进行模拟)。
-
好的,如果没有其他解决方案,那么我想我必须这样做。您如何看待控制器在实例化时运行功能?你会说有更好的方法来实现这一点,从而可以进行更好的测试吗?
标签: angularjs unit-testing controller initialization karma-jasmine