3

还有许多其他问题是关于 Sinon 未能响应的问题,但它们似乎都可以通过一些普通的东西来解决,比如无效的响应数据或切换的配置选项。

我的情况如下:

在主应用程序(at /js/app/)中,requireJS 用于加载网站应用程序模块。
对于测试(at /js/test),requireJS 也用于加载相同的模块,但添加了MochaChaiSinon

这是应用程序的引导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

对于它的价值,Transfer.loadSomeData()将返回一个promise: jQuery 的输出或立即解决的对新对象$.ajax()的承诺。 在任何一种情况下,响应都是一个 Ajax 包装器,它将使用响应数据进行解析。$.Deferred

Sinon 从不发出响应——Ajax 调用只是超时。
经过多次试验和错误,我将其简化为最简单的解决方案 - 仍然失败。
该解决方案在此处的 jsfiddle上。

这是怎么回事sinon
为什么响应永远不会被发送回调用位置(#ajax在这种情况下是 jQuery 的)?
有错误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 回答