Angularjs 如何监视指令的link函数中定义的函数?

Angularjs 如何监视指令的link函数中定义的函数?,angularjs,angularjs-directive,jasmine,Angularjs,Angularjs Directive,Jasmine,我想在指令的link函数中定义的函数中添加spyOn。编译元素后,我尝试了spyOn(元素,函数名),但它不起作用。在指令的作用域中公开函数 function link (scope, element, attrs) { // this can be spied on scope.myFunction = function () { }; // this won't be able to be spied on function myPrivateFu

我想在指令的link函数中定义的函数中添加spyOn。编译元素后,我尝试了spyOn(元素,函数名),但它不起作用。

在指令的作用域中公开函数

function link (scope, element, attrs) {
    // this can be spied on
    scope.myFunction = function () {

    };

    // this won't be able to be spied on
    function myPrivateFunction () {

    }
}
var directiveScope = angular.element('#myElement').scope();
// or .isolateScope() for isolate scope directives
检索指令的作用域

function link (scope, element, attrs) {
    // this can be spied on
    scope.myFunction = function () {

    };

    // this won't be able to be spied on
    function myPrivateFunction () {

    }
}
var directiveScope = angular.element('#myElement').scope();
// or .isolateScope() for isolate scope directives
监视函数

spyOn(directiveScope, 'myFunction');

您可以通过使用isolateScope来实现这一点

/--directive.js--//
(功能(角度){
角度模块('module')
.指令(“指令”,指令);
指令。$inject=['dv'];
函数指令(dv){
var指令={
链接:链接,
替换:正确,
限制:“E”,
范围:{
bindto:'=bindto'
}
};
返回指令;
功能链接(范围、元素、属性){
scope.generate=generate;
scope.generate();
函数生成(){
/**
*生成代码在这里
**/
}
}
}
})(角度);
//--指令.spec.js--//
描述(‘单元测试:折线图指令’、定向测试);
函数定向测试(){
var工厂;
var$compile;
var$范围;
var元素;
var编译元素;
var$隔离镜;
在每个(模块(“模块”)之前;
beforeach(注入函数($compile,$rootScope,u dv){
$compile=\$compile;
$scope=\$rootScope\$new();
dvFactory=\u dv;
元素=“”;
//编译指令元素
compiledElement=$compile(元素)($scope);
//获取已编译元素的isolateScope
$isolateScope=compiledElement.isolateScope();
}));
它('should call and spy on generate',function(){
//$isolateScope中的spyOn a generate()
spyOn($isolateScope,'generate')。和.callThrough();
//调用该方法
$isolateScope.generate();
//检查它叫什么
期望($isolateScope.generate).toHaveBeenCalled();
});

}
在指令链接函数中定义的函数在外部不可用,它们位于链接函数的闭包中,您无法访问它。您可以改为测试模板。或者,如果它们是非DOM修改对象,则为该指令指定一个控制器并测试该控制器。或者,如果这是一个常见的功能,那么将它们抽象到实用程序服务/工厂并对它们进行测试。我正在测试模板,我只是想模拟在指令的链接函数中声明的一个特定函数。你真的不模拟函数,而只是模拟依赖项及其方法。你是说间谍吗?即使这就是你的意思,但据我所知,如果它们是在闭包中定义的,你真的不能这么做。我只是想补充一下@PSL所说的,指出当你发现自己不得不模拟/监视一个在你试图测试的东西之外看不到的函数时,它通常是测试或代码的标志可能需要一些改进。很难说是哪一个,因为您没有包含任何源代码。