неопределенное значение var внутри test.each global при использовании asyn c beforeAll - Jest 24 - PullRequest
0 голосов
/ 09 января 2020

У меня есть тест, который выполняет вызов API, создает массив строк, а затем перебирает их внутри блока it, используя Jest test.each global

describe('Something fancy', () => {
  let strings;

  beforeAll(async (done) => {
    strings = await getStrings() // returns an array (e.g. ['foo', 'bar', 'baz']);
    done(); // as per https://jestjs.io/docs/en/asynchronous#callbacks
  });

  test.each(strings)('string %s here', async (string) => {
    console.log(string); // undefined
    console.log(strings); // undefined
  };
};

по какой-то причине test.each работает синхронно и «не ждет» разрешения getStrings, тогда как, если я превращу test.each в обычный it('tests something', () => { console.log(strings) });, строки будут зарегистрированы, как и ожидалось:

  it('tests something', async () => {
    console.log(strings); // ['foo', 'bar', 'baz']
  })

Почему это происходит и есть ли способ обойти это?

1 Ответ

1 голос
/ 09 января 2020

Обратные вызовы внутри методов Jest выполняются асинхронно, поэтому в момент выполнения test.each(strings) значение strings все еще не определено.

Есть несколько способов обойти это:

  1. Подготовка данных вне тестового прогона. Например, добавьте скрипт pretest npm
"pretest": "node prepare-data.js"
"test": "jest"

В prepare-data.js вы можете вызвать getStrings() и записать результат во временный файл, который будет выбран в тесте.

Используйте нода-волокна для упаковки асинхронных вызовов

Переключитесь на другой исполнитель тестов, который поддерживает динамическое создание тестовых случаев. Пример описан в этом вопросе: Jest или Mocha: динамически создавать тесты на основе асинхронной c инициализации

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