Sinon的假服务器没有响应

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

我的情况如下:

在主应用程序(at /js/app/ )中,requireJS用于加载网站应用程序模块。
对于测试(at /js/test ),requireJS也用于加载相同的模块,但添加了Mocha , Chai和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

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

Sinon永远不会发出响应–Ajax调用只是超时。
经过多次试验和错误后,我将其减少到最简单的解决方案 – 仍然失败了。
这个解决方案在这里是jsfiddle 。

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

我做错了什么,如何修复它以使这个例子有效?

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