Sinon: 名前付きスパイ

作成日 2013年02月25日  ·  13コメント  ·  ソース: sinonjs/sinon

スパイ(オブジェクトプロパティのもの以外)を名前で作成できると、アサーションエラーメッセージが読みやすくなります。 たとえば、ジャスミンのスパイはこれを許可します。

Help wanted

最も参考になるコメント

私はこれを見ています。 名前は常にproxyが、i Object.defineProperty(spy, 'name', { value: 'new name' })場合は、「新しい名前」が報告されます。

これを再開するのは素晴らしいことです。

全てのコメント13件

Sinonは、ラップされた関数名を検査します。 したがって、空の名前付き関数をラップすることで、スパイに名前を付けることができます。

var spy = sinon.spy(function doStuff() {});

この手法を使用すると、特定の長さの関数を作成することもできます。

var spy = sinon.spy(function doStuff(a, b, c) {}); // spy.length === 3

私が見る限り、それは常に関数名としての「プロキシ」です。 このコメントは本当ですか?

私が見る限り、それは常に関数名としての「プロキシ」です。 このコメントは本当ですか?

実行可能な例を投稿していただけませんか?

// test/index.js
var sinon = require('sinon');

var spy = sinon.spy(function doStuff() {
    console.log('Name: ' + spy.name);
});

spy();
➜  sinon-test node test/index.js 
Name: proxy

以前に何をしたか思い出せませんが、関数名が「proxy」で、「doStuff」であることがわからないテストの失敗からMocha出力を取得していました。 正確に何だったか思い出せたら投稿します

私はこれを見ています。 名前は常にproxyが、i Object.defineProperty(spy, 'name', { value: 'new name' })場合は、「新しい名前」が報告されます。

これを再開するのは素晴らしいことです。

私はこれを次のように回避しました:

const mapMethod = sinon.spy(Array.prototype, 'map');
const methodName = map.wrappedMethod.name;
console.log(methodName); // 'map'

@Tbhesswebberは、テスト以外のコードが関数の名前に依存している場合は機能しません。

ああ...素晴らしい点。 私は高階関数を教えるためのカリキュラムに取り組んでいます(開始点としてArray.prototypeを使用)。これがこの問題につながる原因です。 非常に異なるユースケース!

PS-実際に試してみると、実装の詳細をテストするのは本当に面倒です!

これがどのように役立つかがわかります。 誰かがこれをもっと深く掘り下げたいのなら、それはクールだろう。

返された関数の名前に依存する機能またはテストがある可能性があります。 その場合は、それを回避する方法について話し合う必要があります。

@mroderickがオリジナルでスパイを作成するとき、 Object.defineProperty(spy, 'name', { configurable: true, value: spy.wrappedMethod.name })はそれを行うべきですか?

これは以前は私たちが持っていた機能だったと思います-関数に名前を付けてスパイに名前を付けます-途中で失われたと思います。 明示的に名前を付けることを許可するという提案には問題ありません。 しかし、「プロキシ」の名前も変更するべきではありませんか? スパイされた関数は、元の関数にできるだけ近いように見える必要があるように感じます。 正しいアリティを確保しますが、名前を変更しました。 間違っているようです。

APIにもspy.named(name)があることに気づきました😆スパイにdisplayNameプロパティを設定します。 関数名も変更する必要があると思います。 今これを見てください。

#1987のパッチはv7.2.7リリースされました。 これでみんなに満足できるかどうか教えてください❤️

このページは役に立ちましたか?
0 / 5 - 0 評価