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来说,它还是相当新的。非常感谢你的帮助!

+0

那么,createController()调用init()。所以,只要测试一下调用createController()就可以做它应该做的事情,即正确地完成了“完成的事情”。 –

+0

感谢您的回答! 我的问题是,它不仅仅是被调用的init()。另外,我简化了我的示例,但可能会有几个不同的“init”函数,这样就可以独立测试它们的逻辑。 (顺便说一句,有点偏题:我很喜欢你的诺言教程,它真的很棒,帮了很大忙,所以谢谢!) – Augustin

+0

这是一个鸡和鸡蛋问题:init由构造函数调用,而你需要调用构造函数来调用你的init函数。我仍然认为,你有一个或几个由构造函数调用的“私有”函数是一个实现细节。你真正想测试的是构造函数完成它的工作。您可以通过委托服务功能(可以进行单元测试,并在测试控制器时进行模拟)来简化这一点。 –

回答

0

把JB Nizet的回答放在这里而不是在评论中。

非常感谢您的回答!

这是一个鸡和鸡蛋问题:init由构造函数调用,并且需要调用构造函数以调用init函数。我仍然认为,你有一个或几个由构造函数调用的“私有”函数是一个实现细节。你真正想测试的是构造函数完成它的工作。您可以通过委托服务功能(可以进行单元测试,并在测试控制器时进行模拟)来简化这一点。

相关问题