2016-07-20 26 views
2

是否有任何方法來檢查JavaScript綁定函數?如何檢查JavaScript綁定函數

我想從一個函數返回一個綁定函數,並在單元測試中聲明綁定函數的目標boundThis和boundArgs。它們似乎被定義爲ECMAScript中的內部對象,並且不能在程序中訪問。

有什麼方法可以訪問它們嗎?或者也許有些需求相似的人已經寫了一些模塊補丁Function.prototype.bind()?

+3

FWIW ...在單元測試中你通常要測試*一段代碼做什麼*,而不是*它怎麼做。測試的「什麼」是什麼,實施的「如何」。這在單元測試中似乎是錯誤的重點。 – deceze

+1

請參閱http://stackoverflow.com/questions/26545549/chaining-bind-calls-in-javascript-unexpected-result/26547029#26547029。調用綁定函數時使用的'this'不是該函數的某種隱藏屬性。它是用於包裝原始函數以創建綁定函數的邏輯的一部分。除了您可以檢查函數中的局部變量或函數內部的任何其他邏輯之外,您無法檢查,並且@Bergi正確地指出,您不想也不應該需要。 –

回答

1

不,沒有(除非你啓動調試器)。

無論如何你都不應該測試綁定函數。您也可以使用閉包來實現完全相同的行爲,這也不會暴露閉包變量。這並不重要。您不應該測試實現,而是測試行爲 - 只需檢查調用返回的函數是否調用具有期望值的目標。

+0

謝謝你的回答。 – matianfu

+0

但我絕對不同意你在那個綁定函數不應該被測試。如今,ES6的承諾經常被使用。許多函數返回promise。但承諾是一個不透明的對象,無法檢查承諾是什麼,沒有辦法按值進行等式檢查。更好的方法是返回一個綁定的函數,如果它可以被檢查。由於承諾可能有副作用,它比解決承諾和斷言結果好得多。保持測試功能「純」是解決問題的關鍵。 – matianfu

+0

Promise與Haskell中的monad類似,意思是它包含一個值。但它本身不是一個價值。這是個問題。並且函數返回它不能是純粹的。解決方法是使用表示綁定函數的對象作爲返回值而不是承諾。它可以轉化爲一個沒有歧義的承諾。那麼這個對象可以直接聲明,而不是解決承諾。函數返回這樣的對象可以是純的。 – matianfu