7

简要描述;简介

将测试服务器重置为已知状态会导致我的测试失败,因为 DataTables 实例启动的 Ajax 请求在服务器重置时正在进行。我想通过在服务器重置之前停止 DataTables 请求来防止这种情况。

详细说明

我有一个在某些页面上使用 DataTables 的应用程序。这些数据表都执行服务器端查询来填充它们的表。

当我执行系统测试时,有时会发生竞争情况:

  1. 测试运行程序启动测试服务器。

  2. 测试运行程序在测试浏览器中加载一个页面,其中某处有一个 DataTable 实例。

  3. 测试运行程序运行测试,该测试执行其检查并结束。

  4. 测试运行程序将测试服务器重置为已知状态以进行下一次测试。

  5. 页面上显示一条警报,指出 DataTables 遇到了 Ajax 错误。警报说:

DataTables 警告:table id=[some id] - Ajax 错误。有关此错误的更多信息,请参阅http://datatables.net/tn/7

  1. 我的测试系统不期待警报,即使测试实际上是成功的,它也会感到困惑并记录失败。(或者在某些情况下,它会崩溃。)

我知道这是因为服务器突然中断了 Ajax 请求。我正在寻找的是一种防止警报出现的方法。我想在服务器重置之前停止所有正在进行的 DataTables 请求。

解决方案已被拒绝

  • 告诉 DataTables 实例不要使用警报:如果 DataTables 实例遇到与重置测试服务器无关的问题,我希望我的测试大声失败。

  • 修改测试服务器:我更喜欢让服务器保持简单,而不用担心可能无法响应的请求。

  • 等待客户端所有请求结束:这会大大减慢测试速度,尤其是当这种等待重复进行数十次测试时。

  • 将测试浏览器指向一个新页面,上面没有 DataTables,因为这会中断当前请求:这又会损害测试性能。

4

2 回答 2

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();
    }
}

解释

即使在未加载 jQuery 或未加载 DataTables 的页面上执行,代码也可以正常工作。因此它首先检查它们是否已加载,如果未加载则不执行任何操作。然后它获取所有 DataTable 实例的设置对象。在每个设置对象中,它会检查是否存在,当发出 Ajax 请求时jqXHR,它会填充一个 jQuery对象。jqXHR它将调用它的abort()方法,从而中止请求。

上面的代码适用于 DataTables 1.10,无论表使用 1.10 API 还是 1.9 API。但是,请注意,该jqXHR字段不是正式的公共 API 的一部分。同时,其中一位开发人员在DataTables 论坛上毫无保留地谈论它,因此这可能不是私有 API 中最危险的部分。完全依赖公共 API 的解决方案会更加麻烦,因为必须修改所有 DataTable 实例以跟踪标记 Ajax 事务开始和结束的事件或具有自定义 Ajax 处理程序等。这将有不仅适用于正在测试的项目的代码,而且适用于提供恰好使用 DataTables 的 HTML 小部件的任何 3rd 方库。

请注意,上面的代码不会阻止DataTables 实例发起请求。但这不是我所关心的。

于 2014-10-23T15:41:57.260 回答
4

我认为更好的方法是在 DataTables 中使用preXhr.dt事件。

$('.datatable').
  on('preXhr.dt', function ( e, settings, data ) {
    if (settings.jqXHR) settings.jqXHR.abort();
}).DataTables({});
于 2017-01-06T16:50:19.863 回答