2017-07-19 48 views
1

以下:我如何在Sinon存根匿名函數?

const sinon = require('sinon') 

const a =() => { return 1 } 
sinon.stub(a) 

拋出TypeError: Attempted to wrap undefined property undefined as function

stub如果有一個對象的作品,所以我嘗試使用this。在Node.js的REPL(v6.11):

> const a =() => { return 1 } 
undefined 
> this.a 
[Function: a] 

然而,在我的摩卡規範,它失敗:

const a =() => { return 1 }           

console.log(a) 
// => [Function: a] 

console.log(this.a) 
// => undefined 

我缺少什麼?我該如何做這項工作?

順便說一句:我知道我可以stub一個對象的方法,像這樣:const stub = sinon.stub(object, 'a'),但這不是我在這裏跟這個問題。

+0

的可能的複製[類型錯誤:試圖換未定義的屬性作爲函數(https://stackoverflow.com/ question/42271151/typeerror-attempt-to-wrap-undefined-property-as-function) –

+0

不是重複的。這不是關於制定者/獲得者。 –

+1

你不能像這樣工作。對於存根,Sinon _requires_需要一個「根對象」,因爲它需要替換要存根該對象的函數引用。 REPL中的'this'僅適用於REPL的實現方式。 – robertklep

回答

2

你不能讓它像這樣工作。對於存根,Sinon 要求是一個「根對象」,因爲它需要替換要存根在該根對象中的函數引用。 REPL中的this僅適用於REPL的實現方式。在最新節點(v8)中,它不再像上述那樣自動將功能綁定到this

sinon.stub需要一個對象,然後你可以存根的屬性。所以,你應該能夠做到

const obj = { 
    a: (() => return 1; }) 
}; 

,然後能夠調用

const stub = sinon.stub(obj, "a"); 

當你看到,你設置const a是在你的榜樣的功能 - 它需要一個對象,那麼sinon可以在該對象中存儲特定的屬性。我相信這是因爲它給了它一些sinon可以參考的東西,因此sinon也可以支持像object.method.restore()這樣的東西。

另一個解決辦法是結合this你自己(雖然不推薦):

const a =() => { return 1 } 
this.a = a; 

sinon.stub(this, 'a').returns(2); 
console.log(this.a()); 
// => 2 
+0

是的,我知道你可以存根對象的方法。但我想明白,爲什麼我不能在沒有這個對象的情況下做到這一點,因爲它曾經在早期版本的Sinon中工作過。 –

+1

@PawełGościcki'sinon.stub(fn)'也不適用於舊版本的Sinon。你的意思是'sinon.spy(fn)'? – robertklep

+0

它過去一天就像這樣工作。這是一個考古學鏈接:http://sinon.readthedocs.io/en/master/Stubs.html –