このスニペットはSinon2.0.0では正常に機能しますが、Sinon4.2.2では失敗します。
it('returns correct thisValue', function() {
window.SomeClass = function() {
this.counter = 0;
this.inc = function() {
this.counter++;
};
this.getCounter = function() {
return this.counter;
};
};
var spy = sinon.spy(window, 'SomeClass');
var some = new window.SomeClass();
some.inc();
expect(spy.thisValues[0].counter).toEqual(1);
expect(spy.thisValues[0].getCounter()).toEqual(1);
some.inc();
expect(spy.thisValues[0].counter).toEqual(2);
expect(spy.thisValues[0].getCounter()).toEqual(2);
});
thisValues[0]
オブジェクトはプロキシであり、 some
の実際のインスタンスを参照していないようです。
これはSinon4.2.2のエラーです。
Expected undefined to equal 1
TypeError: undefined is not a function (evaluating 'spy.thisValues[0].getCounter()')
これは、 git bisect
を使用して動作がいつ変更されたかを確認するのに適した候補です。これにより、変更が意図的なものか(機能)、そうでないか(バグ)の手がかりが得られる可能性があります。
提供されている例@ PVince81を、 git bisect run
で使用できる小さなテストスクリプトに変換することはそれほど難しくありません。
git bisect
使い方がわからない場合は、レベルアップする絶好の機会です。
http://www.marclittlemore.com/how-to-find-bugs-using-git-bisect-with-this-easy-guide/
ああ、私は二等分線が大好きです! お世話になります。
911c498dc14dc4034ba019526bf58f8b24d77da0スパイはnew
(#1626)で呼び出しを通過します
それをしてくれてありがとう、@ PVince81! 修正は、コンストラクターのスパイをサポートするために必要な変更に触れるため、#1265も検査する必要がある場合があります。
オブジェクトがnew
で作成されていない場合、このメソッドが呼び出され、 thisValue
の内容、ひいてはthisValues
ます。 対照的に、newが使用されるときに呼び出されるメソッドは、 thisValue
変更せずに残します。
私たちのコードはこれを1回しか使用していないことを考えると、シノンの内部に頭を包む時間がなく、資格を感じていないので、クイックルートに移動してこれをトリガーした単一のテストを変更したいと思います潜在的に重大な変更を加える
それほど多くの人がこの問題について不満を言っているようには見えないので、おそらく人々は通常この方法でテストせず、修正はそれだけの価値がありません(単なる観察、メンテナが決定するまで)
一般的に使用されていない、または少なくとも一般的に報告されていない場合でも、このリグレッションを修正してもらいたいと思います。
同じ問題が発生しましたが、これを修正する予定はありますか?
@ ivan-zakharchuk誰もボランティアをしていないのなら、計画はありません。 あなたがそれを修正したいのであれば、取られる可能性のある自然な次のステップがあります;-)
これは問題のあるコミットです: https :
言うまでもなく、私はこれに対する修正を書くのに長い時間を費やしましたが、失敗しました。 これはthis
値の悪夢です。 中心的な問題は、ここで提供された関数をnew
すると、本質的に新しいthis
が作成されるのに対し、 thisValues[0]
(元の投稿で使用)はthis
テスト自体のnew
によって作成されたthis
(つまり、 var some = new window.SomeClass();
)-私が知っている非常に混乱しています。
基本的に、これを修正するということは、両方の方法を試すことを意味します- new
を呼び出すことは、絶対に新しいthis
意味しますが、2回呼び出す必要があります(つまり、OPのテストで1つ、 proxy-invoke.js
1つ) this
ます。 私が考えることができた唯一のことは、関数を1つのthis
から別の
上記が理にかなっていることを願っています。お気軽に訂正/説明をリクエストしてください。 new
キーワードが実際に何をするかについての復習については、ここを参照してください-TLDRは、コンテキストに関係なく、新しいオブジェクトを作成し、それをthis
にします。
とにかく、私が気づいたことの1つは、911c498(リグレッションを導入したコミット)には、対処する問題をカバーするテストが含まれていないことです。ES6クラスでnew
を使用する必要があります。 これはおそらく、テストのリンティングオプションがES5にのみ対応しているため、 class
キーワードを許可していないためです。 現在の問題の将来の修正で911c498の修正が修正解除されないように、テストを追加するコミットがあります。興味があればPRできます。
最も参考になるコメント
一般的に使用されていない、または少なくとも一般的に報告されていない場合でも、このリグレッションを修正してもらいたいと思います。