Sinon - 间谍构造方法

时间:2017-09-24 20:53:15

标签: javascript node.js sinon

我发现了几个相关问题,但似乎没有一个问题对我想要实施的内容有帮助。

所以,我想监视一个构造函数方法,这样当使用构造函数创建的对象在另一个范围另一个函数中调用此方法时,我可以知道该调用所使用的参数制成。

示例:

function Constructor(args){
  this.method = sinon.spy()
}

function someFunction(){
  obj = new Constructor(args);
  obj.method()
}

console.log(Constructor.method.args[0]); // list the args of the obj.method() call

非常感谢任何帮助。

编辑:我意识到我把这个问题说错了,最后问了一些完全无关紧要的事情:-)

1 个答案:

答案 0 :(得分:1)

这样,您可以监视Constructor.method:

function Constructor(args){
    this.method = function() {}
}

const obj = new Constructor();
obj.method = sinon.spy(obj.method);
obj.method('someArg');

console.log(obj.method.args[0]);  // [ 'someArg' ] 

但正如你所说的那样做是不可能的,你不能拥有一个静态方法和一个具有相同名称的类方法,以及如果你不止一次实例化那个类怎么样......无论如何,我能带来的最好的是一个在构造函数上使用Proxy的解决方案,如:

function Constructor(args) {
    this.method = function () {}
}

const ProxyConstructor = new Proxy(Constructor, {
    construct: function (target, args, newTarget) {
        const c = new target(...args);
        const origMethod = c.method;
        c.method = function (...args) {
            ProxyConstructor.methodArgs = ProxyConstructor.methodArgs || [];
            ProxyConstructor.methodArgs = ProxyConstructor.methodArgs.concat(args)
            origMethod(...args);
        };
        return c;
    }
});


function someFunction() {
    obj = new ProxyConstructor();
    obj.method('test')
}

someFunction();
console.log(ProxyConstructor.methodArgs); // ['test']

您可以将该代码粘贴到文件中并进行尝试。此外,有时在编写测试时,您可能必须重构代码以使其可测试,或者您可以在编写代码(TDD)之前编写测试。