2017-09-24 69 views
0

我發現了一些相關的問題,但似乎沒有任何幫助我想要實現的東西。因此,我想窺視一個構造函數方法,以便當使用構造函數創建的對象在另一個函數中調用此方法的另一個作用域時,我可以知道該調用的參數。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 

任何幫助將不勝感激。

編輯:我才意識到自己措辭的問題錯了,最後問的東西完全瑣碎:-)

+0

我剛剛看到你添加了什麼。這是不可能的,在你的'console.log(Constructor.method.args [0]);'你正在使用方法作爲靜態函數,事實並非如此。想象一下,如果你有5個不同的構造函數實例化。 –

回答

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)之前先編寫測試。

+0

感謝您的回答。然而在你的例子中,console.log和obj聲明在同一個範圍內。我想要做的是知道該方法是否被稱爲即使在一個無法訪問的範圍內... – Nfys

+0

我已經更新了我的答案,請看看。 –