sinon server.autoRespond
sinon server.autoRespond
我正在学习测试,所以我使用karma、karma jasmine和sinon.js构建了这个简单的例子:我有一个ajax请求,一旦成功,它就会设置一个全局变量。使用sinon fakeServer,我伪造响应,如果我手动使用sinon.server.respond()函数触发响应,一切都会好起来。但是,将sinon fakeServer更改为autoRespond=true,并不像预期的那样。测试失败,因为全局变量仍然未定义。在我看来,当设置为autoRespond=true时,fakeRequest似乎不会应答。有人建议为什么吗?谢谢你的帮助。测试代码:
var requestResult; // global variable
function loadFirstData () {
var request = $.ajax( {
url : "/rest/first/",
type : "GET",
timeout : 5000,
dataType: "json"
} );
request.done( function ( data ) {
requestResult = data;
} );
request.fail( function ( jqXHR, textStatus ) {
console.error( "Request failed: " + textStatus );
console.error( "Object: ", jqXHR );
} );
}
测试:
describe( 'Ajax requests', function () {
var xhr;
beforeEach(function() {
xhr = sinon.fakeServer.create();
// this doesn't work
//xhr.autoRespond = true;
xhr.respondWith(
'GET',
'/rest/first/',
function (request) {
request.respond(
200,
{ "Content-Type": "application/json" },
'{ "returnValue": 20.13 }'
);
}
);
xhr.respondWith(
'GET',
'rest/second/',
function (request) {
request.respond(
200,
{ "Content-Type": "application/json" },
'{ "returnValue": 3333 }'
);
}
);
});
afterEach(function() {
xhr.restore();
});
it( 'should get first data', function () {
loadFirstData();
// this works
xhr.respond();
expect( requestResult ).toEqual( { "returnValue": 20.13 } );
} );
} );
我自己找到了答案。:)sinon假冒服务器不会立即响应请求,但会有很短的延迟。因此,我必须使用done()Funktion异步进行jasmine测试。因此以下代码有效:
describe( 'Ajax requests', function () {
var xhr;
// beforeEach get the jasmine done as argument
beforeEach(function(done) {
xhr = sinon.fakeServer.create();
// autoRespond is set
xhr.autoRespond = true;
xhr.respondWith(
'GET',
'/rest/first/',
function (request) {
request.respond(
200,
{ "Content-Type": "application/json" },
'{ "returnValue": 20.13 }'
);
}
);
xhr.respondWith(
'GET',
'rest/second/',
function (request) {
request.respond(
200,
{ "Content-Type": "application/json" },
'{ "returnValue": 3333 }'
);
}
);
// starts the tests
done();
});
afterEach(function() {
xhr.restore();
});
// the asynchronous test get the jasmie done as argument, as well
it( 'should get first data', function (done) {
loadFirstData();
// delays the expectations check
setTimeout( function() {
expect( requestResult ).toEqual( { "returnValue": 20.13 } );
// says jasmine the test is finished
done();
}, 500);
} );
} );
Sinon文档指出,由于您发现的原因,autoRespond
不适合测试。
我最终在fakeServer
上实现了一个respondImmediately
属性,它将同步响应任何请求。这在几周前(v1.14.0)刚刚合并到项目中,但如果你更新到最新版本,你应该可以得到它。查看此处的文档。
将respondImmediately
属性设置为true,而不是将autoRespond
属性设置为true。然后,您可以移除所有异步done
调用,并移除您期望的setTimeout
包装器。希望这有助于整理你的测试!
相关文章:
- 如何使用angular js从2个表(在sql server中)中提取数据
- 如何在cloud9中向server.js发送post请求
- 使用谷歌地图、C#、ASP.net、SQL Server显示带有标记的地图.地图未显示
- 使用Javascript或SQL Server将Outlook电子邮件发送到SQL表
- 在 api 文档中 socket.io“Server(srv:http#Server, opts:Object)”是什么
- 在引导程序中从 HTML 表单执行 Python (CGI) 文件.带有Apache Server的JS
- ExpressJS Server - 如何处理多个域
- 当我关联runat=“server”属性时,JQuery UI 按钮集在单选按钮上不起作用
- 节点.js集群模块不会在 http 上释放套接字/端口.Server.close().
- 如何使用 ajax 从 sql Server 获取单选按钮的值,并表示列表单选按钮
- jQuery: setInterval effects on the server?
- 如何在不刷新页面的情况下从 PHP 中的 SQL Server 数据库获取数据
- JavaScript Stack - Web Server 和 API Server:一起或分开
- Google AppRTC Web Server
- webpack-dev-server 不会监视创建的新文件
- 使用php中的单选按钮从MS SQL SERVER中删除行
- 将数据从本地SQL Server同步到Internet上的MySQL Server(实时服务器)
- 如何修复MS SQL Server 2008R2/2012和Javascript之间的日期差异
- 未定义节点不是server.js文件中的函数
- sinon server.autoRespond