1

sinonjsスパイの動作を理解するのに問題があります。

これは私のテストです:

asyncTest('sinon async spies test', 
function() { 

    var pApi = 
    { 
        product: function(id, options) { 
            var d = { o: 'a result' };
            options.success(d);
            return d;
        },
    };

    this.spy(pApi, 'product');
    pApi.product(1, { success: function(data) {} });

    //Assertion 1
    ok(pApi.product.calledOnce, 'product API called: ' + 
        pApi.product.calledOnce);

    setTimeout(
            function() { 
                //Assertion 2
                ok(pApi.product.calledOnce, 
                    'product function called once (calledOnce: ' +   
                     pApi.product.calledOnce + ')');
                start();
            }, 1000);

});

上記のテストをqunitとsinonjsで(sinon-qunitを介して)実行すると、アサーション1に合格しますが、アサーション2に失敗します(setTimeoutコールバック内)。実際、pApi.product.calledOnce(アサーションのメッセージを介して行われるように)コンソールにの値を記録すると、それはundefinedです。

注:これはテストファイルの先頭にあります。

sinon.config.useFakeTimers = false;

誰かがこの奇妙な行動を説明できますか?pApi.productsetTimeoutコールバック内にあり、両方がないcalledOnce場合は、スパイの有効なプロパティとして持つべきではありませんか?

更新しました

http://api.qunitjs.com/asyncTest/に基づいて、上記の動作が表示される理由を理解しました。

asyncTeststart()関数が呼び出されるまでテストランナーを実行しません。上記のテストは、に変更this.spy(pApi, 'product')したときに機能しましたsinon.spy(pApi, 'product')testどうやら、の代わりにを使用するかどうかに依存しているようです。これは、メソッドの実行asyncTest時に影響します。this.spy

これを理解するために、実際にsinon、qunit、およびsinon-qunitコードを調べる必要があります。

4

1 に答える 1

2

スパイを変数に割り当て、それを使用してcalledOnceをアサートする必要があります。

asyncTest('sinon async spies test', function() { 
    var pApi = { 
        product: function(id, options) { 
            var d = { o: 'a result' };
            options.success(d);
            return d;
        }
    };

    var pApiSpy = this.spy(pApi, 'product');
    pApi.product(1, { success: function(data) {} });

    //Assertion 1
    ok(pApiSpy.calledOnce, 'product API called');

    setTimeout(
            function() { 
                //Assertion 2
                ok(pApiSpy.calledOnce, 
                    'product function called once');
                start();
            }, 1000);

});

これにより、両方のアサーションが渡されます。start()問題は、QUnitがテストの完了を示すのをまだ待っているにもかかわらず、テスト関数の最後にメソッドを復元するSinonに関係していると思います。タイムアウト関数が呼び出されると、pApi.productはスパイオブジェクトではなくなるため、calledOnceプロパティはありません。スパイを独自の変数に設定すると、タイムアウトが呼び出されるまでスパイを処理できます。

于 2013-01-06T20:21:50.147 に答える