Sinonjs fakeserver - 多次 ajax 调用
Sinonjs fakeserver - multiple ajax calls
我将 QUnit 与 sinon 一起使用。我怎样才能使 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);
});
我上面的问题是我只能从其中一种方法得到响应。假服务器能处理这个吗?
更新: 似乎添加另一个 server.respond()
解决了问题。但一定有更好的方法吧?
根据文档,无论 ajax 调用次数如何,听起来都应该调用一次作业:
server.respond();
Causes all queued asynchronous requests to receive a response.
Fiddle: http://jsfiddle.net/3qj20r5m/1/
嗯,我认为 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()
两次:第一次调用是为了响应 "releases" 初始 ajax 请求(对 /foo
) 从它的队列中,然后调用第一个成功回调。在该回调中,您启动了第二个 ajax 调用,Sinon 然后保持该调用,直到您再次调用 respond()
。
换句话说,调用respond()
将使Sinon释放所有当前持有的ajax请求,但在你的情况下,一次只持有一个。使用我上面提到的 autoRespond
选项可以立即消除这种需要,因为 Sinon "responds",但我相信在这种情况下你需要使测试异步(或者至少,这是最佳实践)。
祝你好运!
Sinon 文档声明 autoRespond
不适合测试,因为它将异步执行。这默认为 10 毫秒后,这刚好足以跳到下一帧执行,可能会导致测试出现一些竞争条件。我发现这个是因为我有类似的嵌套 AJAX 调用我想测试。
我最终在 fakeServer
上实现了 respondImmediately
属性,它将同步响应任何请求。这几周前才合并到项目中(v1.14.0),但如果你更新到最新版本,你应该能够得到它。 Check out the docs here..
在您的 beforeEach
块中,不要将 autoRespond
属性 设置为真,而是将 respondImmediately
属性 设置为真。然后删除所有 server.respond()
调用,你应该设置好了!
我将 QUnit 与 sinon 一起使用。我怎样才能使 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);
});
我上面的问题是我只能从其中一种方法得到响应。假服务器能处理这个吗?
更新: 似乎添加另一个 server.respond()
解决了问题。但一定有更好的方法吧?
根据文档,无论 ajax 调用次数如何,听起来都应该调用一次作业:
server.respond(); Causes all queued asynchronous requests to receive a response.
Fiddle: http://jsfiddle.net/3qj20r5m/1/
嗯,我认为 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()
两次:第一次调用是为了响应 "releases" 初始 ajax 请求(对 /foo
) 从它的队列中,然后调用第一个成功回调。在该回调中,您启动了第二个 ajax 调用,Sinon 然后保持该调用,直到您再次调用 respond()
。
换句话说,调用respond()
将使Sinon释放所有当前持有的ajax请求,但在你的情况下,一次只持有一个。使用我上面提到的 autoRespond
选项可以立即消除这种需要,因为 Sinon "responds",但我相信在这种情况下你需要使测试异步(或者至少,这是最佳实践)。
祝你好运!
Sinon 文档声明 autoRespond
不适合测试,因为它将异步执行。这默认为 10 毫秒后,这刚好足以跳到下一帧执行,可能会导致测试出现一些竞争条件。我发现这个是因为我有类似的嵌套 AJAX 调用我想测试。
我最终在 fakeServer
上实现了 respondImmediately
属性,它将同步响应任何请求。这几周前才合并到项目中(v1.14.0),但如果你更新到最新版本,你应该能够得到它。 Check out the docs here..
在您的 beforeEach
块中,不要将 autoRespond
属性 设置为真,而是将 respondImmediately
属性 设置为真。然后删除所有 server.respond()
调用,你应该设置好了!