Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在angularjs的非测试代码中使用spies_Javascript_Angularjs_Tracking - Fatal编程技术网

Javascript 在angularjs的非测试代码中使用spies

Javascript 在angularjs的非测试代码中使用spies,javascript,angularjs,tracking,Javascript,Angularjs,Tracking,我最近对单元测试进行了更深入的研究。我想知道是否有一种方法可以在生产代码中使用间谍。我有跟踪服务。如果能够访问其他服务,甚至控制器,而不必修改它们的代码,那就太好了 在应用程序代码中是否有方法监视从服务和控制器调用的方法?最好的方法是什么 编辑 自动取款机。我使用此模式监视服务: 编辑2 我忘了在内部函数中添加一个return。应该没有什么可以阻止您这样做,尽管我认为这是一个错误的工具 如果你有角度,你应该考虑使用装饰模式。您甚至可以使用来截取角度方向上的几乎任何内容 例如,您可能有一个如下所示

我最近对单元测试进行了更深入的研究。我想知道是否有一种方法可以在生产代码中使用间谍。我有跟踪服务。如果能够访问其他服务,甚至控制器,而不必修改它们的代码,那就太好了

在应用程序代码中是否有方法监视从服务和控制器调用的方法?最好的方法是什么

编辑 自动取款机。我使用此模式监视服务:

编辑2
我忘了在内部函数中添加一个return。

应该没有什么可以阻止您这样做,尽管我认为这是一个错误的工具

<>如果你有角度,你应该考虑使用装饰模式。您甚至可以使用来截取角度方向上的几乎任何内容

例如,您可能有一个如下所示的间谍函数:

function createSpy(serviceName, source, spyNames, rootScope) {
    var spy = angular.extend(angular.isFunction(source) ? function () {
        console.log("Called " + serviceName + '()', arguments);
        // broadcast with rootScope
        return source.apply(source, arguments);
    } : {}, source);

    spyNames.forEach(function(name) {
        var original = spy[name];
        spy[name] = function() {
            console.log("Called " + serviceName + '.' + name, arguments);
            // broadcast with rootScope
            return original.apply(spy, arguments);
        };
    });

    return spy;
}
app.config(function($provide) {
    decorateWithSpy($provide, '$http', ['get']);
    decorateWithSpy($provide, '$compile', []); 
});
然后,您可以创建一个泛型函数来生成装饰器:

function decorateWithSpy($provide, service, spyNames) {
    $provide.decorator(service, function($delegate, $rootScope) {
        return createSpy(service, $delegate, spyNames, $rootScope);
    });
}
您可以按如下方式配置间谍:

function createSpy(serviceName, source, spyNames, rootScope) {
    var spy = angular.extend(angular.isFunction(source) ? function () {
        console.log("Called " + serviceName + '()', arguments);
        // broadcast with rootScope
        return source.apply(source, arguments);
    } : {}, source);

    spyNames.forEach(function(name) {
        var original = spy[name];
        spy[name] = function() {
            console.log("Called " + serviceName + '.' + name, arguments);
            // broadcast with rootScope
            return original.apply(spy, arguments);
        };
    });

    return spy;
}
app.config(function($provide) {
    decorateWithSpy($provide, '$http', ['get']);
    decorateWithSpy($provide, '$compile', []); 
});

这样做会导致我所有的
$http
$compile
函数被打印到控制台。

应该没有什么可以阻止你这样做,尽管我认为这是一个错误的工具

<>如果你有角度,你应该考虑使用装饰模式。您甚至可以使用来截取角度方向上的几乎任何内容

例如,您可能有一个如下所示的间谍函数:

function createSpy(serviceName, source, spyNames, rootScope) {
    var spy = angular.extend(angular.isFunction(source) ? function () {
        console.log("Called " + serviceName + '()', arguments);
        // broadcast with rootScope
        return source.apply(source, arguments);
    } : {}, source);

    spyNames.forEach(function(name) {
        var original = spy[name];
        spy[name] = function() {
            console.log("Called " + serviceName + '.' + name, arguments);
            // broadcast with rootScope
            return original.apply(spy, arguments);
        };
    });

    return spy;
}
app.config(function($provide) {
    decorateWithSpy($provide, '$http', ['get']);
    decorateWithSpy($provide, '$compile', []); 
});
然后,您可以创建一个泛型函数来生成装饰器:

function decorateWithSpy($provide, service, spyNames) {
    $provide.decorator(service, function($delegate, $rootScope) {
        return createSpy(service, $delegate, spyNames, $rootScope);
    });
}
您可以按如下方式配置间谍:

function createSpy(serviceName, source, spyNames, rootScope) {
    var spy = angular.extend(angular.isFunction(source) ? function () {
        console.log("Called " + serviceName + '()', arguments);
        // broadcast with rootScope
        return source.apply(source, arguments);
    } : {}, source);

    spyNames.forEach(function(name) {
        var original = spy[name];
        spy[name] = function() {
            console.log("Called " + serviceName + '.' + name, arguments);
            // broadcast with rootScope
            return original.apply(spy, arguments);
        };
    });

    return spy;
}
app.config(function($provide) {
    decorateWithSpy($provide, '$http', ['get']);
    decorateWithSpy($provide, '$compile', []); 
});

这样做会将我的所有
$http
$compile
函数打印到控制台。

谢谢您的提醒。我完全忘记了它们的存在:)但这并不是我真正想要的。我不想以任何方式改变服务功能,我只想添加事件处理程序,在应用程序的不同部分添加特定的操作,我想在一个单独的地方进行跟踪。我想我很困惑。装饰器不改变服务功能。它包裹着他们。然而,间谍活动确实会修改现有的服务。Jasmine Spies修改了现有的服务,你提议的代码也修改了。也许我没有正确理解装饰器的功能。如果我想看函数,我不是必须用同样的方法重写它们吗?如果您能提供一个使用装饰器代替间谍的示例,我将非常高兴;)但一般来说,我希望避免的是必须为我想要跟踪的每一个服务编写一个decorator?哈这是有趣的创造:)这工作得很好。它将原始服务包装在一个派生对象中,该对象对代码进行插入。一点也不涉及原始服务:)谢谢你的提醒。我完全忘记了它们的存在:)但这并不是我真正想要的。我不想以任何方式改变服务功能,我只想添加事件处理程序,在应用程序的不同部分添加特定的操作,我想在一个单独的地方进行跟踪。我想我很困惑。装饰器不改变服务功能。它包裹着他们。然而,间谍活动确实会修改现有的服务。Jasmine Spies修改了现有的服务,你提议的代码也修改了。也许我没有正确理解装饰器的功能。如果我想看函数,我不是必须用同样的方法重写它们吗?如果您能提供一个使用装饰器代替间谍的示例,我将非常高兴;)但一般来说,我希望避免的是必须为我想要跟踪的每一个服务编写一个decorator?哈这是有趣的创造:)这工作得很好。它将原始服务包装在一个派生对象中,该对象对代码进行插入。它完全不涉及原始服务:)