单元测试控制器触发自定义指令

时间:2015-06-11 06:24:39

标签: angularjs unit-testing angularjs-directive jasmine angularjs-controller

假设您有一个角度+茉莉花应用程序,您的控制器看起来像这样:

app.controller('MyController', function($scope) {
   $scope.myFunc = function() {
   $scope.myArray = [];
       // after some operations here
       myArray.push(new_obj);
   }
   $scope.someOtherArray = [];
}

此外,我有一个由myArray中的每个元素触发的自定义指令。像这样:

app.directive('myDirective', function() {
    return {
         // directive goes here
         // and some definitions
         link: function(scope, element, attrs) {
               scope.someOtherArray.push(other_obj)
         }
    }
}

最后,在HTML中:

<div myDirective ng-repeat="obj in myArray"></div>

因此,每次向myArray添加元素时,都会创建另一个指令元素并修改$scope.someOtherArray。这很好用,但我发现myFunc()和控制器的属性很难测试:

controller = $controller('MyController', { $scope: mockScope });
SpyOn(mockScope, 'myFunc').and.callThrough();
// expectGET and expectPOST here.
mockScope.myFunc();

但是,在运行该代码之后,有一些对象(依赖于自定义指令)在调用mockScope.myFunc();后没有更新(例如someOtherArray)。显然,我需要手动编译自定义指令:

var element = '<div myDirective ng-repeat="obj in myArray"></div>';
element = $compile(element)(mockScope);
嗯,这看起来有点尴尬。我希望在运行mockScope.myFunc()之后,每个副作用都会自动发生。否则,我需要考虑流程中涉及的每个指令并编译它们。

有更好的方法吗?

0 个答案:

没有答案