2010-07-06 3 views
1

Я имею яваскрипта функцию с помощью JQuery:делают Javascript функция обратного вызова иш

my.namespace.loadSomeStuff = function() { 

    $.get('/Services/loadStuff', function(c){ 
     $("#stuffDiv").html(c); 
    }); 
}; 

и пытаюсь писать тесты для этого.

сейчас, так как эта функция ничего не возвращает и загружает какой-то материал асинхронный, используя jquery's 'get'. Мне трудно это проверить.

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

my.namespace.loadSomeStuff(function(){ 
    alert('boo'); 
    assertSame('Login', $("#stuffDiv").find(......); 
}); 

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

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

благодаря т

ответ

1

Вы должны были бы добавить аргумент метода loadSomeStuff получить функцию обратного вызова вы вызывается в вашем примере кода, а затем намеренно называют его:

my.namespace.loadSomeStuff= function(callback) { 
    $.get('/Services/loadStuff', function(c){ 
     $("#stuffDiv").html(c); 
     if (callback!==undefined) 
      callback(); 
    }); 
}; 

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

Альтернативой было бы использование теста с сырой тайм-аутом.

Вы можете использовать ajaxSuccess, как упоминалось Ником (возможно, в сочетании с таймаутом и/или также ловлей ajaxError?). Но мне кажется, что это может добавить слишком много знаний о внедрении для модульного теста. Что делать, если loadSomeStuff будет изменен в будущем, чтобы работать без XMLHttpRequest или, возможно, использовать его иногда, когда он не кэшируется? Затем будет протестирован единичный тест. Конечно, вы можете обновить тест в соответствии с реализацией, но тогда это не очень полезный модульный тест, не так ли?

+0

это, хотя говорит мне, что «обратный вызов не является функцией» есть ли какой-либо другой способ, который я должен вызвать эту функцию сейчас? –

+0

Ах, да, вам нужно проверить, что «обратный вызов» действительно был передан, иначе код, который не обеспечил обратный вызов, теперь провалится! Добавлено в примере кода выше. – bobince

1

Вы можете использовать the global AJAX events for this, например:

$(document).ajaxSuccess(function() { 
    assertSame('Login', $("#stuffDiv").find(......)); 
}); 

ajaxSuccess произойдет после каждый запрос AJAX, если вы хотите, событие, которое выбежала после всех одновременных запросов завершена, то ajaxStop - это то, что вам нужно. Оба этих обработчика не обязательно должны быть привязаны к your AJAX methods, они могут быть выполнены в модульных тестах.

Это нормальные события (full list here), так что вы можете .bind()/.unbind() по мере необходимости, например, когда тестовый модуль выше сделано:

$(document).ajaxSuccess(function() { 
    assertSame('Login', $("#stuffDiv").find(......)); 
    $(this).unbind('ajaxSuccess'); //cleanup 
}); 
Смежные вопросы