我无法监视node.js
当前范围内的现有功能:
function myFunc() {console.log("Spy on me and I'll have you arrested"};
sinon.spy(myFunc);
myFunc.restore(); // throws an error: myFunc.restore is not a function
但是,我可以监视作为对象成员的函数:
var anObject = {
myFunc: function() {console.log('Being spied on turns me on');}
};
sinon.spy(anObject, 'myFunc');
sinon.myFunc.restore(); // smooth sailing
根据the docs,在我看来,这应该可以正常工作。我该如何完成?
最佳答案
在JavaScript中,当function
作为参数传递时,它是一个按值传递的引用,如下所示:
function foo() { console.log("foo"); } // func1, referenced by `foo`
function bar() { console.log("bar"); } // func2, referenced by `bar`
function mutate(func) {
func = bar;
}
mutate( foo );
foo();
这将打印出
"foo"
,而不是"bar"
,因为mutatate
不会更改foo
对func1
的引用。以下是Sinon
spy.js
的相关源代码:https://github.com/sinonjs/sinon/blob/master/lib/sinon/spy.jscreate
函数查看第一个参数是否为函数,如果是,则将其包装在代理中(create: function create(func, spyLength) {
,第148行)。然后,它返回代理。因此,您需要使用新的代理替换
myFunc
:function myFunc() {console.log("Spy on me and I'll have you arrested"};
myFunc = sinon.spy(myFunc); // here
但是,您不能使用
myFunc.restore()
撤消间谍,因为.restore
无法更改myFunc
引用的目标。请注意,restore
也不返回值,因此您必须自己跟踪myFunc
:function myFuncOriginal() {console.log("Spy on me and I'll have you arrested"};
var myFunc = sinon.spy(myFuncOriginal);
myFunc = myFuncOriginal; // instead of `myFunc.restore();`
关于javascript - 无法窥探现有功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38033894/