【问题标题】:Any way to test asynchronous jquery plugin with qunit that avoids embedded "start()" and keeps it asynchronous?有什么方法可以使用 qunit 测试异步 jquery 插件,避免嵌入“start()”并保持异步?
【发布时间】:2012-02-01 02:06:44
【问题描述】:

我正在编写我的第一个 jquery 插件。它严重依赖于对服务器的 ajax 调用。通常,插件中的 ajax 调用将按照标准异步运行。

我正在使用 qunit 进行测试。我的第一次尝试以经典方式失败:

test ('check asynchronous call', function ()
{
    stop();
    $.my_plugin('do asynchronous call');
    start();
    equal('expected val', var_set_after_async_call_finishes, 
      'async var set as expected?');
})

也就是说,“equal”在异步调用完成之前运行。

看来我可以通过两种方式修改插件代码:

  1. 直接在插件中嵌入“start()”(但这会使它与不应在生产环境中运行的代码混淆)
  2. 向 my_plugin 添加一个可选参数,强制 $.ajax 同步运行。

我采用了第二种方法,向 my_plugin 添加了一个可选参数,当设置为 false 时,它​​会同步运行 ajax 函数。然后我将测试修改为:

test ('check asynchronous call', function ()
{
    async = false;
    $.my_plugin('do asynchronous call', async);
    equal('expected val', var_set_after_async_call_finishes, 
      'async var set as expected?');
})

这行得通。

但是有没有办法可靠地测试插件而无需以任何方式修改其代码?

【问题讨论】:

标签: javascript jquery unit-testing asynchronous qunit


【解决方案1】:

您可以执行诸如模拟 $.ajax 之类的操作,以便它返回您想要的数据并同步运行。然后你可以为服务器的不同返回编写不同的案例。

 (function ($) {

    var originalAjax;
    var mockData = { whatever: "server returns" };

    module("Testing plugin with mock ajax", {
        setup: function () {
            var mockAjax = function (options) {
                start();
                options.success(mockData);
            };

            originalAjax = $.ajax;
            $.ajax = mockAjax;

        },
        teardown: function () {
            $.ajax = originalAjax;
        }
    });

    test("Your test", function () {
        stop();

        $.my_plugin('do asynchronous call');

        ok(true, "your assertion, whatever your plugin changes or returns");

    });

})(jQuery);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多