Lou*_*uis 6 javascript ajax jquery datatables system-testing
将测试服务器重置为已知状态会导致我的测试失败,因为DataTables实例在服务器重置时正在启动Ajax请求.我想通过在重置服务器之前停止DataTables请求来防止这种情况.
我有一个应用程序,我在一些页面上使用DataTables.这些DataTable都执行服务器端查询以填充其表.
当我执行系统测试时,有时会出现竞争条件:
测试运行器启动测试服务器.
测试运行器在测试浏览器中加载一个页面,其上有一个DataTable实例.
测试运行器运行测试,执行检查并结束.
测试运行器将测试服务器重置为已知状态以进行下一次测试.
页面上显示警报,表示DataTables遇到Ajax错误.警报说:
DataTables警告:table id = [some id] - Ajax错误.有关此错误的更多信息,请参阅http://datatables.net/tn/7
我知道这是因为服务器突然中断了Ajax请求.我正在寻找的是一种防止警报首先出现的方法.我想在服务器重置之前停止所有正在进行的DataTables请求.
告诉DataTables实例不要使用警报:如果DataTables实例遇到与重置测试服务器无关的问题,我希望我的测试失败.
修改测试服务器:我宁愿保持服务器简单,不用担心有关于可能置之不理请求.
在客户端等待所有请求结束:这可能会大大减慢测试速度,尤其是当数次测试重复此等待时.
将测试浏览器指向一个没有DataTables的新页面,因为这将中断当前请求:这将再次损害测试性能.
Lou*_*uis 12
在测试完成所有检查后,驱动浏览器的软件在浏览器中执行以下代码.(这将是在测试后运行的某种"拆卸"代码.)
if (typeof $ !== "undefined" && $.fn.dataTable) {
var all_settings = $($.fn.dataTable.tables()).DataTable().settings();
for (var i = 0, settings; (settings = all_settings[i]); ++i) {
if (settings.jqXHR)
settings.jqXHR.abort();
}
}
Run Code Online (Sandbox Code Playgroud)
即使在没有加载jQuery或没有加载DataTables的页面上执行代码,代码也会被编写.因此它首先检查它们是否已加载,如果未加载则不执行任何操作.然后,它为所有DataTable实例提取设置对象.在每个设置对象中,它检查是否存在jqXHR,jqXHR当发出Ajax请求时,该对象填充了jQuery 对象.它将调用该abort()方法,从而中止请求.
上面的代码与DataTables 1.10一起使用,无论表是使用1.10 API还是1.9 API.但请注意,该jqXHR字段不是公共API的正式部分.与此同时,其中一位开发人员在DataTables论坛上没有提出任何警告就这样说,因此这可能不是私人API最依赖的风险部分.纯粹依赖于公共API的解决方案将更加麻烦,因为必须修改所有DataTable实例以跟踪标记Ajax事务开始及其结束或具有自定义Ajax处理程序等的事件.这将具有不仅要对正在测试的项目的代码进行处理,还要提供任何提供碰巧使用DataTables的HTML小部件的第三方库.
请注意,上面的代码不会阻止 DataTables实例发起新请求.但这不是我所关注的问题.
小智 5
我认为更好的方法是使用DataTables 中的preXhr.dt事件。
$('.datatable').
on('preXhr.dt', function ( e, settings, data ) {
if (settings.jqXHR) settings.jqXHR.abort();
}).DataTables({});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4605 次 |
| 最近记录: |