这样,您就可以在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)之前先编写测试。
我刚刚看到你添加了什么。这是不可能的,在你的'console.log(Constructor.method.args [0]);'你正在使用方法作为静态函数,事实并非如此。想象一下,如果你有5个不同的构造函数实例化。 –