3

Sinon が応答しないことについて尋ねる質問は他にもたくさんありますが、それらはすべて、無効な応答データやトグルされた構成オプションなど、ありふれたことで解決するようです。

私の状況は次のとおりです。

メイン アプリケーション ( /js/app/) では、requireJS を使用して Web サイト アプリケーション モジュールをロードします。
テストのために (で/js/test) requireJS も同じモジュールをロードするために使用されますが、MochaChai、およびSinonが追加されます。

これはtestアプリケーションのブートストラップです:

define(
    "testRunner",
    ["require", "chai", "module", "sinon", "mocha"],
    function( require, chai, module ){
        // Chai setup
        assert = chai.assert;
        should = chai.should();
        expect = chai.expect;

        // Mocha setup
        mocha.setup( 'bdd' );

        // tests
        require(
            module.config().tests,
            function(){
                mocha.run();
            }
        );
    }
);

require(["testRunner"]);

module.config().testsrequirejs.config({})呼び出しで次のように定義されます。

"config": {
    "testRunner": {
        "tests": [
            "test/format",
            "test/transfer"
        ]
    }
}

Mocha がtransferテストを処理すると、Sinon は失敗し、テストはタイムアウトします。

これはtransferテスト 全体です。

define(
    ["transfer"],
    function( Transfer ){
        Transfer = new Transfer();

        describe( "Transfer", function(){
            describe.only( "#loadSomeData", function(){
                it( "should load the test data", function( done ){
                    var server = sinon.fakeServer.create();

                    server.autoRespond = true;
                    server.respondWith( "string" );

                    var async = Transfer.loadSomeData( 123 );

                    async.done( function( data, s, x ){
                        data.should.equal( "string" );
                        done();
                    });

                    server.respond();
                });
            });
        });
    }
);

testRunner の出力は次のようになります。
timeout of 2000ms exceeded

価値があるのは、jQueryの出力または新しいオブジェクトへのすぐに解決されたpromiseのいずれかTransfer.loadSomeData()を返すことです。 いずれの場合も、応答は、応答データで解決される Ajax ラッパーです。promise$.ajax()$.Deferred

Sinon が応答を発行することはありません。Ajax 呼び出しは単にタイムアウトします。
多くの試行錯誤の後、私はそれを可能な限り単純な解決策に減らしましたが、それでも失敗しました.
その解決策はjsfiddle hereにあります。

ここで何が起こっているのsinonですか?応答が呼び出し元 (この場合は
jQuery の ) に返されないのはなぜですか? にバグはありますか?#ajax
sinon

私は何を間違っていますか? この例を機能させるにはどうすれば修正できますか?

4

1 に答える 1

4

問題は実際には解決されていませんが、Sinon の構文を少し変更することで、この問題を回避しました。

ここに私のテストスイートがあります:

describe( "Transfer", function(){
    var suite = this;

    beforeEach( function(){
        suite.server = sinon.fakeServer.create();
    });

    afterEach( function(){
        suite.server.restore();
    });

    describe( "#loadSomeData", function(){
        it( "should load the test data", function( done ){
            var async = Transfer.loadSomeData( 123 );

            suite.server.requests[0].respond(
                200,
                { "Content-Type": "application/json" },
                JSON.stringify({test: "success"})
            );

            async.done( function( data, s, x ){
                data.test.should.equal( "success" );
                done();
            });
        });
    });
});

ご覧のとおり、単純にサーバーに応答するように指示するのではなく、最初の要求オブジェクト ( requests[0]) を明示的に選択してから、応答メソッドを呼び出します。

以前の構文 ( ) が実際に機能するかどうかはわかりませんがserver.respond()、サーバーが受信したリクエストのリストからリクエスト オブジェクトを明示的に選択し、それに直接応答すると問題なく動作します。

于 2013-11-05T15:48:34.723 に答える