将测试服务器重置为已知状态会导致我的测试失败,因为重置服务器时DataTables实例启动的Ajax请求正在进行中。我想通过在重置服务器之前停止DataTables请求来防止这种情况。
我有一个在某些页面上使用DataTables的应用程序。这些数据表均执行服务器端查询以填充其表。
当我执行系统测试时,有时会发生争用情况:
测试运行程序启动测试服务器。
测试运行程序在测试浏览器中加载页面,该页面上有DataTable实例。
测试运行程序运行测试,执行测试并结束。
测试运行程序将测试服务器重置为下一个测试的已知状态。
页面上会显示一条警报,提示DataTables遇到Ajax错误。警报说:
DataTables警告:表ID = [某些ID]-Ajax错误。有关此错误的更多信息,请参见http://datatables.net/tn/7
我知道发生这种情况是因为服务器突然中断了Ajax请求。 我正在寻找的是一种首先防止警报出现的方法。我想 在 重置服务器 之前 停止所有正在进行的DataTables请求。
告诉DataTables实例不要使用警报:如果DataTables实例遇到与重置测试服务器无关的问题,我希望测试彻底失败。
修改测试服务器:我宁愿保持服务器简单,也不必担心 那里的 请求可能无法得到答复。
等待客户端所有请求结束:这可能会大大降低测试速度,尤其是当数十次测试重复此等待时。
将测试浏览器定向到没有DataTables的新页面,因为这会中断当前请求:这又会损害测试性能。
测试完成所有检查后,请驱动浏览器的软件在浏览器中执行以下代码。(这将以某种“拆卸”代码在测试后运行)。
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(); } }
即使在未加载jQuery或未加载DataTable的页面上执行时,代码也可以正常工作。因此,它首先检查它们是否已加载,如果未加载,则不执行任何操作。然后,它获取所有DataTable实例的设置对象。在每个设置对象中,它都会检查是否存在jqXHR,jqXHR当发出Ajax请求时,将使用jQuery 对象填充。它将abort()在其上调用方法,从而中止请求。
jqXHR
abort()
无论表使用1.10 API还是1.9 API,以上代码均适用于DataTables 1.10。但是,请注意,该jqXHR字段正式不是公共API的一部分。同时,其中一位开发人员在DataTables论坛上毫无保留地谈论了这一点,因此这可能并不是私有API所依赖的最危险的部分。而且,仅依赖于公共API的解决方案会麻烦得多,因为必须修改所有DataTable实例以跟踪标记Ajax事务开始和结束的事件或自定义Ajax处理程序等的事件。不仅要针对要测试的项目使用适当的代码,而且还要提供提供恰好使用DataTables的HTML小部件的任何第三方库。
请注意,上面的代码不会 阻止 DataTables实例启动 新 请求。但这不是我所关心的。