Внедрить мгновенные задержки в ember-cli-mirage

Я использую ember-cli-mirage для приемочных испытаний. В конкретном случае я хотел бы проверить поведение при получении данных по медленному соединению.

В ember-cli-mirage есть параметр timing, который имитирует задержку ответа. Однако этот параметр нельзя изменить, чтобы он отличался в конкретном тесте:

// app/mirage/config.js
this.timing = 400;

Что-то еще, что я пробовал, возвращает обещание в поддельной конечной точке. С помощью некоторого импорта/экспорта я мог контролировать разрешение промиса из моего теста. К сожалению, ember-cli-mirage, похоже, не распознает возвращаемое значение как обещание и просто дословно передает его обратно адаптеру:

// app/mirage/config.js
this.get('/StopPoint/Search/:term', (db, request) => {
  return freezer.run(function() {
    return db[`stop-point-search-${request.params.term}`][0];
  });
});

// At my test
freezer.on()
runTests()
freezer.off()

Вопрос: есть ли способ сделать это? То есть: управлять задержкой конкретного ответа в ember-cli-mirage?


person pablobm    schedule 05.03.2016    source источник


Ответы (2)


Несколько мыслей:

  • Вы можете изменить время в конкретном тесте через server.timing. Сервер должен быть переустановлен для каждого теста, чтобы это не повлияло на другие тесты.

    test('for slow behavior', function() {
      server.timing = 400;
      //
    });
    
  • Вы также можете переопределить обработчики маршрутов в тестах, как показано здесь в второй пример руководств по приемочному тестированию. Если вы используете 0.2.0-beta, у обработчиков маршрутов есть опция timing, которую вы можете использовать, чтобы воздействовать только на этот обработчик:

    test('for slow behavior', function() {
      server.get('/slow-query', (schema, request) => {
        //
        return data;
      }, {timing: 400};
    
      visit('/');
      //
      assert();
    });
    

Я думаю, что ваш инстинкт вернуть то, что вы можете контролировать, было бы идеальным способом проверить это в тандеме с чем-то вроде Таймкоп. Возможно, Mirage сможет в конечном итоге добавить API для этого.

person Sam Selikoff    schedule 05.03.2016
comment
Хм, это работает, но я не уверен, что это действительно полезно. Из-за того, как подключен цикл выполнения, я не могу проверить, что происходит в этот промежуточный период, пока приложение ожидает ответа :-/ Конечно, мне не хватает понимания цикла выполнения, поэтому я мог бы пропустить что-то? - person pablobm; 05.03.2016
comment
Какой код в вашем приложении выполняет сетевой запрос? Крючок модели на обработчике маршрута? - person Sam Selikoff; 07.03.2016
comment
Нет, это в контроллере. Это поисковый запрос, и условие поиска отображается из аргумента запроса. - person pablobm; 07.03.2016
comment
@SamSelikoff, я пытался смоделировать дросселирование сети в тестовой среде, но не могу этого сделать из-за асинхронных помощников. Шаги: 1) установить время сервера в ec-mirage на 1000 мс 2) запустить действие 3) снова установить время сервера в ec-mirage на 0 мс 4) запустить то же действие 5) использовать async wait() практически, второй вызов должен разрешаться первым. Но это не так, поскольку более поздние сроки сервера переопределяют конфигурацию. В любом случае, я могу проверить это дело? Это был не модельный крючок! - person Gokul Kathirvel; 08.03.2018

Нам нужно было проверить, отображается ли наш элемент <progress> в тесте с помощью Mirage, и мы обнаружили, что создание render, синхронизированный с методом waitFor и settled работает лучше всего (и вообще не требует установки this.server.timing):

const SELECTORS = {
    LOADING_SPINNER: '[role="progressbar"]'
};

test('it displays loading spinner when fetching blog post', async function(assert) {
    this.blogId = 1;
    render(hbs`<BlogPost @blogId={{this.blogId}}/>`); // NOTE: no await
    await waitFor(SELECTORS.LOADING_SPINNER);
    assert.dom(SELECTORS.LOADING_SPINNER).exists({ count: 1 }, 'loading spinner rendered while blog post loads');
    await settled();
    assert.dom(SELECTORS.LOADING_SPINNER).doesNotExist('loading spinner removed when blog post loaded');
});
person user1429980    schedule 17.05.2021