Sinon的假服务器没有响应

时间:2013-11-05 01:35:13

标签: jquery requirejs bdd mocha sinon

还有很多其他问题询问Sinon没有回应,但他们似乎都解决了一些平凡的事情,比如无效的响应数据或切换的配置选项。

我的情况如下:

在主应用程序中(/js/app/),requireJS用于加载网站应用程序模块 对于测试(在/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()的输出或立即解析的对新$.Deferred对象的承诺。
在任何一种情况下,响应都是一个Ajax包装器,它将使用响应数据解析。

Sinon永远不会发出响应--Ajax调用只是超时。
经过多次反复试验,我将其简化为最简单的解决方案 - 仍然失败了 该解决方案在jsfiddle here上。

sinon在这里发生了什么?
为什么响应永远不会被发回到调用位置(jQuery的#ajax,在这种情况下)? sinon中有错误吗?

我做错了什么,如何解决这个问题?

1 个答案:

答案 0 :(得分: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())是否真的有效,但是从服务器收到的请求列表中明确选择请求对象并直接响应它可以正常工作。