ember-cli-mirage в устаревшем приложении

У нас есть приложение, которое использовало Pretender для предоставления приспособлений для тестов. Теперь мы пытаемся перейти на ember-cli-mirage. Мы не можем перенести все приборы сразу. Итак, что в основном происходит, так это то, что мы запускаем свой собственный сервер Pretender, а ember-cli-mirage запускает свой собственный. Whic выдает следующее предупреждение:

Вы создали второй экземпляр Pretender, в то время как один уже был запущен. Одновременный запуск двух серверов Pretender приведет к неожиданным результатам и будет полностью удален в будущей основной версии. Пожалуйста, вызовите .shutdown() на своих экземплярах, когда они вам больше не нужны для ответа.

Поскольку это всего лишь предупреждение, это не должно быть проблемой в течение переходного периода. Проблема в том, что как только Mirage загружается в наше приложение, старые маршруты Pretender перестают отвечать. Я предполагаю, что это то, на что ссылается "... приведет к неожиданным результатам".

Есть ли шанс запустить ember-cli-mirage вместе с созданными вручную маршрутами Pretender? Или просто использовать сервер Mirage и вводить туда эти маршруты?


person Michal Bryxí    schedule 21.02.2017    source источник


Ответы (2)


Я бы использовал сервер Mirage, а затем загрузил бы в него маршруты Pretender. (Сервер Mirage на самом деле просто объект, который news является экземпляром Pretender). Если люди увидят папку mirage, они, вероятно, ожидают, что маршруты будут определены там. Кроме того, Mirage очищает свой экземпляр Pretender во время тестирования.

В mirage/config.js вы можете импортировать существующие маршруты Pretender и вызывать их там. У Mirage есть сахар поверх Pretender, но вы всегда можете получить доступ к базовому экземпляру претендента через this.pretender внутри функции config:

// mirage/config.js
import setupYourOldRoutes from 'somewhere';

export default function() {
  this.get('users'); // new Mirage shorthand

  setupYourOldRoutes(this.pretender);
}

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

person Sam Selikoff    schedule 21.02.2017

Основываясь на ответе @samselikoff, я нашел решение для своего случая. У нас уже есть одна центральная точка, которая занимается созданием экземпляра претендента. Таким образом, исправление заключалось в том, чтобы просто пройти Претендент Миража вместо создания нового:

// somewhere.js
export default function () {
  // initPretender: function () {
  //   this.pretender = new Pretender();
  // }
  initPretender: function (pretender) {
    this.pretender = pretender;
  },
  getPretender: function () {
    return this.pretender;
  }
}

// mirage/config.js
import pretenderWrapper from 'somewhere';

export default function() {
  this.get('users'); // new Mirage shorthand

  pretenderWrapper.initPretender(this.pretender);
}

Сложная часть заключалась в том, чтобы убедиться, что initPretender() вызывается до того, как любой из наших устаревших кодов попытается вызвать getPretender(). Я думаю, что обычно это не проблема. В нашем случае мы пропатчили tests/helpers/start-app.js, чтобы некоторые фикстуры вводились в каждом тесте. И это привело к слишком раннему вызову getPretender().

person Michal Bryxí    schedule 21.02.2017
comment
Довольно конкретное решение, которое прилипает к конкретным проблемам. Пишите сюда на случай, если у кого-то возникнут подобные проблемы. - person Michal Bryxí; 21.02.2017