Есть ли способ протестировать асинхронный плагин jquery с помощью qunit, который избегает встроенной функции start () и поддерживает ее асинхронность? - PullRequest
1 голос
/ 03 января 2012

Я пишу свой первый плагин 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?');
})

А именно, «равный» выполнялся до завершения асинхронного вызова.

Похоже, что я могу изменить код плагина двумя способами:

  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?');
})

Это работает.

Но есть ли способ надежно протестировать плагин, не изменяя его код каким-либо образом?

1 Ответ

2 голосов
/ 31 января 2012

Вы можете сделать что-то вроде насмешки $ .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);
...