Angular-Mock覆盖父指令并模拟它

时间:2015-07-07 19:32:25

标签: angularjs unit-testing karma-jasmine

我正在尝试模拟一个驻留在它父母的同一模块上的指令。 因为我想将测试隔离到只有child指令我试图模拟父。 如果它们都位于不同的模块上,那么它们将很容易实现,但由于它们是相同的,因此我得到了多个具有相同名称的指令。 为了绕过我试图在我的模拟指令上添加这样的东西:

        return {
                priority: 100,
                terminal:true,
                restrict:'CE',
                scope:{
                    zoom:'@'
                },
                template:'<div ng-transclude></div>',
                controllerAs:'parentController',
                controller:mockController,
                transclude: true
            };

问题在于,虽然我可以覆盖父指令,但是从不调用子指令,因为它具有较低的优先级,终端将停止执行。

我正在寻找的是一种在karma-jasmine上测试并使用angular.mock时覆盖指令定义的方法。

1 个答案:

答案 0 :(得分:2)

当你添加一个指令时,它会自动创建一个工厂并将指令放在一个数组上,这样多个指令就可以响应同一个标记。

This person有一种方法可以通过创建一个带有指令名称的服务来使其工作。不幸的是,可能由于角度变化,他的解决方案并没有为我解决它因为角度要求$指令上的$ bindings键和$$ moduleName,将它们添加到工厂解决了它。

我让它像这样嘲笑:

    angular.mock.module('theModuleIWantToTest');
    angular.mock.module(function($provide){
        $provide.factory('mockParentDirective', function(){
                var directive={
                    priority:0,
                    name:'mockParent',
                    restrict:'CE',
                    scope:{
                        zoom:'@'
                    },
                    template:'<div ng-transclude></div>',
                    controllerAs:'mockParentController',
                    controller:mockController,
                    transclude: true,
                    $$moduleName:'theModuleIWantToTest',
                    $$bindings:{}
                };
                return [directive];
            }
        );

    });

其中mockParent是我想要覆盖的先前声明的指令。

我不认为这是最好的方法,但目前我发现它是覆盖Angular 1.4.2指令的唯一方法