Nano Hash - криптовалюты, майнинг, программирование

Тестирование функции, содержащей асинхронный код

С qUnit я понимаю, как использовать asyncTest(), если у вас есть асинхронный код в ваших тестах, но что, если у вас есть функция, содержащая асинхронный код?

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

Возьмите этот код, например:

function makeAjaxCall(){
    $.get('/mypage', {}, function(data){
        // Do something with `data`
    },'json');
}

Как я могу вызвать makeAjaxCall() в тесте, а затем запустить тесты на data, который возвращается из запроса ajax?


Ответы:


1

В этой ситуации вы можете использовать глобальные обработчики событий jQuery Ajax. . Привяжите его перед вызовом, отмените привязку после завершения теста, возможно, с помощью метода модуля в Qunit.

Что-то вроде (не проверено):

asyncTest(function() {
  expect(1);

  $(document).ajaxSuccess(function(e, xhr, settings) {
     var jsonRep = JSON.parse(xhr.responseText);
     // assert on jsonRep
     //ok(true);
  });
  $(document).ajaxError(function(e) {
     ok(false);
  });
  $(document).ajaxComplete(function() {
     start();

     $(document).unbind('ajaxSuccess ajaxError ajaxComplete');
  });

  makeAjaxCall();
});

Обратите внимание, что глобальные обработчики не имеют доступа к проанализированному содержимому, и вам придется повторно анализировать их самостоятельно. используя JSON.parse. Не идеально, но другого способа я не знаю.

28.03.2013
  • Этот ответ кажется, что он должен работать, но что, если асинхронное событие не является запросом ajax? Будет ли мой единственный вариант вручную запускать событие из обратного вызова? 28.03.2013
  • Я думаю так. Вам нужно иметь какой-то хук в асинхронном процессе и определить, что он завершен. Я не знаю какой-либо конструкции JavaScript, которая бы делала это для каждого типа асинхронной операции. Очевидно, вы можете создать свой собственный для хорошо известных экземпляров, таких как window.setTimeout, переопределив реализацию и проделав некоторую магию за кулисами, но, возможно, гораздо проще сделать обратный вызов. $.Deferred может помочь сделать реализацию чистой. 28.03.2013

  • 2

    Кажется, никому нет дела до mockAjax, поэтому я нашел кое-что получше: sinonJS ! Знаете ли вы функцию автоматического ответа этого замечательного инструмента под названием Fiddler? sinonJS позволяет вам делать то же самое на стороне клиента, это своего рода прокси-сервер обхода ajax. если вам интересно посмотреть пример, дайте мне знать... так что sinonJS может отвечать на любой запрос ajax без доступа к серверу, это своего рода магия, если вы хотите издеваться над своим клиентом, если хотите для модульного тестирования вашего кода javascript.

    08.04.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..