Jest: общий код asyn c между тестовыми блоками - PullRequest
2 голосов
/ 26 мая 2020

У меня есть тестовый код вроде этого:

test('Test', async () => {
  const someData = await setup()
  const actual = myFunc(someData.x)
  expect(actual.a).toEqual(someData.y)
  expect(actual.b).toEqual(someData.y)
  ... many more like this
}

Я хотел бы разбить код на несколько блоков test (потому что я даже не могу добавить сообщение с описанием к каждому expect

Если бы Jest поддерживал asyn c describe, я мог бы сделать это:

describe('Some group of tests', async () => {
const someData = await setup()

test('Test1', async () => {
  const actual = myFunc(someData.x)
  expect(actual.a).toEqual(someData.y)
}

test('Test2', async () => {
  const actual = myFunc(someData.x)
  expect(actual.b).toEqual(someData.y)
}
})

Конечно, я мог бы продублировать вызов настройки для каждого теста, но это замедлило бы по тесту значительно (я заполняю там MongoDB).

Итак, каким образом я могу улучшить структуру моего теста с помощью Jest?

1 Ответ

1 голос
/ 26 мая 2020

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

Ранее Jasmine и Jest разрешали доступ к общему контексту теста с обычными функциями и this. Эта функция устарела в Jest; общие переменные должны быть определены пользователем.

Общий код можно переместить во вспомогательную функцию, которая внутренне использует beforeAll, beforeEach, et c:

const setupTestContext = testContext => beforeAll(async () => {
  Object.assign(testContext, await setup());
});

...

describe('Some group of tests', async () => {
    const someData = {};

    setupTestContext(someData);

    test('Test1', async () => {
      // context is filled with data at this point
      const actual = myFunc(someData.x)
      ...
    }
    ...
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...