Sinon: コンストラクターをスパイするときにスパイのthisValueがインスタンスを指していない

作成日 2018年02月09日  ·  10コメント  ·  ソース: sinonjs/sinon

このスニペットは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()')
Bug Medium Help wanted Regression hacktoberfest pinned

最も参考になるコメント

一般的に使用されていない、または少なくとも一般的に報告されていない場合でも、このリグレッションを修正してもらいたいと思います。

全てのコメント10件

これは、 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できます。

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