我和sinon一起使用QUnit。我怎样才能让sinon的fakeserver回应用相同方法制作的链式ajax?
module('demo', {
beforeEach: function(){
this.server = sinon.fakeServer.create();
},
afterEach: function(){
this.server.restore();
}
});
test('chained ajax calls', function(assert){
this.server.respondWith('GET', '/foo', [200,
{ 'Content-Type': 'application/json' }, '{ "foo": 1 }' ]);
this.server.respondWith('GET', '/bar', [200,
{ 'Content-Type': 'application/json' }, '{ "bar": 1 }' ]);
var successCount = 0;
$.get('/foo', function(data){
successCount++;
$.get('/bar', function(){
console.log('bar success');
successCount++;
});
});
this.server.respond();
assert.strictEqual(successCount, 2);
});
我上面的问题是我只得到其中一种方法的回复。 fakeserver能够处理这个吗?
更新:似乎添加另一个server.respond()
可以解决问题。但是必须有更好的方法,对吗?
根据文档,无论ajax呼叫计数如何,听起来都应该对作业进行一次调用:
server.respond(); 导致所有排队的异步请求收到响应。
答案 0 :(得分:3)
server.repond()
也应该这样做。在任何情况下,我通常会将我的假服务器设置为自动响应。除非您需要在响应之前检查请求,否则这似乎更容易:
var server;
QUnit.module('fake server tests', {
beforeEach: function() {
server = sinon.fakeServer.create();
// *** it's this option I'm referring to...
server.autoRespond = true;
server.respondWith('GET', '/foo', [200, {
'Content-Type': 'application/json',
'{ "foo": 1 }'
}]);
server.respondWith('GET', '/bar', [200, {
'Content-Type': 'application/json',
'{ "bar": 1 }'
}]);
},
afterEach: function() {
server.restore();
}
});
QUnit.test('do some ajax', function(assert) {
var done = assert.async();
doTwoAjaxCalls(function () {
// whatever your assertions are...
// (of course, your method would need to perform the callback...)
done();
});
});
<强>更新强>
查看更新后的代码,我们可以了解为什么需要两次致电respond()
:第一次回复#34;发布&#34;来自其队列的初始ajax请求(到/foo
),然后调用第一个成功回调。在该回调中,您启动第二个ajax调用,Sinon然后保持该调用,直到您再次调用respond()
。
换句话说,调用respond()
将使Sinon释放所有当前持有的ajax请求,但在您的情况下,一次只能保留一个。使用我上面提到的autoRespond
选项消除了这种需要,因为Sinon&#34;响应&#34;马上,但我相信你需要在这种情况下使测试异步(或者至少,这是最好的做法)。
答案 1 :(得分:3)
Sinon文档声明autoRespond
不适合测试,因为它将异步执行。这默认为10ms之后,这足以碰到下一个执行帧,可能会导致测试的某些竞争条件。我发现这是因为我有类似的嵌套AJAX调用,我想测试它。
我最终在respondImmediately
上实施了fakeServer
属性,该属性将同步响应任何请求。这几个星期前刚刚合并到项目中(v1.14.0),但如果你更新到最新版本,你应该能够得到它。 Check out the docs here.
在beforeEach
块中,不要将autoRespond
属性设置为true,请将respondImmediately
属性设置为true。然后删除所有server.respond()
来电,您应该设置!