2017-07-19 31 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 

私は何をしないのですか?どうすればこの作品を作れますか?

私はのようにオブジェクトのメソッドを以下のように書くことができます:const stub = sinon.stub(object, 'a')しかし、これは私がこの質問でここにしたものではありません。

+0

の可能性のある重複した[例外TypeError:関数として未定義のプロパティをラップしようとしました](https://stackoverflow.com/

別の回避策は、(それはお勧めしませんが)自分でthisと結合することです質問/ 42271151/typeerror-to-wrap-undefined-as-function) –

+0

実際は重複していません。これはセッター/ゲッターに関するものではありません。 –

+1

このように動作させることはできません。スタブの場合、Sinonはルートオブジェクトでスタブする関数参照を置き換える必要があるため、 "ルートオブジェクト"を必要とします。 REPLの 'this 'は、REPLがどのように実装されているかによってのみ機能します。 – robertklep

答えて

2

このようにすることはできません。スタブを使用する場合、Sinon がルートオブジェクトでスタブする関数参照を置き換える必要があるため、「ルートオブジェクト」が必要です。 REPLにあるthisは、REPLの実装方法によってのみ機能します。最新のノード(v8)では、機能を自動的に説明のようなthisにバインドしません。

sinon.stubはオブジェクトを取り込み、プロパティをスタブすることができます。だから、

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

を行い、その後、あなたが目撃した通り、あなたはあなたの例で機能するconst aを設定

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

を呼び出すことができるようすることができるはず - それはオブジェクトであることが必要とsinonは、そのオブジェクト内の特定のプロパティをスタブすることができます。私はこれの理由を信じています。なぜなら、それは何かを助けることができるからです。なぜsinonobject.method.restore()のようなものもサポートすることができます。

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 –

関連する問題