【问题标题】:Sinon's fake server is not responding诗乃的假服务器没有响应
【发布时间】:2023-12-28 03:01:01
【问题描述】:

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

我的情况如下:

在主应用程序中(/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 有 bug 吗?

我做错了什么,我该如何解决它才能让这个示例正常工作?

【问题讨论】:

    标签: jquery requirejs bdd mocha.js sinon


    【解决方案1】:

    虽然问题并未真正解决,但我已通过对 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()) 是否真的有效,但是从服务器收到的请求列表中显式选择请求对象并直接响应它可以正常工作。

    【讨论】: