Как вызвать $ (document) .ready (function () {}) в модульном тестировании - PullRequest
5 голосов
/ 03 декабря 2009

Я испытываю трудности при попытке вызвать document.ready (function () {}) в моих модульных тестах. Предположим, у меня есть несколько из них в моем файле javascript, и один из них вызывается внутри именованной функции, т.е.

function myFunction() {
    $(document).ready(function() {
        //...
    });
}

Как мне на самом деле вызывать их в моих модульных тестах, чтобы я мог их на самом деле проверить? Я использую JsTestDriver для модульного тестирования моих javascripts.

Спасибо.

Ответы [ 5 ]

6 голосов
/ 03 декабря 2009

Если это модульный тест, я предполагаю, что вы проверяете выходные данные функции при наличии определенных входов?

Вот мое мнение:

Вы должны подготовиться к случаю, когда вызывается document.ready, и к случаю, когда это не так.

Таким образом, ваш модульный тест должен запускать каждую функцию дважды - один раз для имитации вызова до готовности и один для имитации вызова после готовности. То есть у вас должен быть один прогон, в котором все, что происходит с документом, уже выполняется, и один прогон, где он просто игнорируется (предположительно, будет вызван позже в жизненном цикле).

EDIT: Просто перечитайте вопрос и поняли его немного больше. Вы можете просто переопределить $ (document) .ready, чтобы сделать то, что вы хотите (что не должно ждать запуска события DOMLoaded, а вместо этого немедленно запускать функции). Этот фрагмент заменит функцию $ (document) .ready функцией, которая делает именно это. Он должен работать до любых юнит-тестов.

var postReady = true; // or false to ignore the function calls.
jQuery.fn.ready = function(fn)
{
    if(postReady && fn) fn();
}

Пример теста:

<html><head><title>whatever</title>
    <script type="text/javascript" src="/JS/jquery-1.3.2.js"></script>

    <script type="text/javascript">
        var postReady = true; // or false to ignore the function calls.
        jQuery.fn.ready = function(fn)
        {
            alert("We stole ready!");
            if(postReady && fn) fn();
        }

        $(document).ready(function()
        {
            alert("The function is called.");
        });
    </script>
</head><body></body>
</html>
5 голосов
/ 03 декабря 2009

Вы можете пройти модульное тестирование слишком далеко, в этом случае вам нужно спросить себя, что вы тестируете и почему. Функция JQuery document.ready работает и работает хорошо (вы знаете это, потому что она была проверена многими людьми).

Я бы предположил, что хитрость заключается в том, чтобы вместо создания анонимной функции присвоить ей имя и использовать ее.

//So instead of this...
$(document).ready(function() {...});

//Do the following
$(document).ready(my_function);

Тогда вы просто протестируете my_function и убедитесь, что она работает. Убедитесь, что вы проверили функции в порядке их загрузки для точного тестирования.

5 голосов
/ 03 декабря 2009

Вы знаете, document.ready... работает, поэтому просто начните с вызова функций внутри него. В идеале, если у вас просто есть функция init, вызываемая функцией ready, тогда вы вызываете одну функцию, она делает то, что вам нужно, и вы можете продолжить свои тесты.

0 голосов
/ 09 декабря 2009

Часть ответа на этот вопрос можно найти здесь .

Ниже приведен пример кода для ответа на этот вопрос на основе приведенного выше ответа:

myFunction();
$.readyList[1]();

В индексе предполагается, что в исходном файле есть только одна функция document.ready. Индекс 0 относится к чему-то еще, что, как мне кажется, является информацией в браузере.

0 голосов
/ 03 декабря 2009

Я предлагаю вам провести рефакторинг кода. Даже если вы найдете способ назвать это, это будет трудно понять другим разработчикам.

Также (ИМХО, я не совсем уверен), вы должны вызывать обработчики готовности даже после того, как было запущено событие готовых страниц, потому что, если вы «устанавливаете» обработчик готовности (), если событие document.ready уже было инициировано jquery немедленно вызывает этот обработчик (поэтому он никогда не теряет это событие, даже если ваш код добавил обработчик слишком поздно - то есть, после того, как document.ready еще было сделано).

Не могли бы вы просто создать пользовательское событие my_on_read ()? Или что-то подобное?

Ну, в конце, пожалуйста, позаботьтесь о событиях ready () и обработчиках, которые будут установлены после того, как document.ready () уже сделан:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...