這樣,您就可以在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個不同的構造函數實例化。 –