Настройка файлов и выполнение кода перед запуском тестов с опцией setupFiles - PullRequest
0 голосов
/ 10 июля 2020

Я хочу запустить какой-то код и выполнить его ПЕРЕД запуском всех тестов.

Моя jest.config.js конфигурация:

  // truncated...
  setupFilesAfterEnv: [
      "./jest.setup.ts"
  ]

jest.setup.ts:

async function setUp() {
  const first = new Promise((res, rej) => {
    res('this called first');
  })
  const second = new Promise((res, rej) => {
    res('this called second');
  })
  first.then((firstRes) => {
    console.log(firstRes)
    second.then(secondRes => console.log(secondRes))
  })
}
beforeAll(done => {
  setUp().then(done => console.log(done));
  done();
})

Итак, я запустил тесты, и похоже, что они вызываются не по порядку:


 PASS  packages/dao/dao.service.spec.ts (5.532 s)
  Dao Tests
    ✓ should be defined (2 ms)
    ✓ get should return null

  console.log
    Running pre-scripts for integration tests...

      at Object.<anonymous> (jest.setup.ts:56:9)

  console.log
    this called first

      at jest.setup.ts:86:13

  console.log
    undefined

      at jest.setup.ts:91:32

  console.log
    this called second

      at jest.setup.ts:87:38

Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        5.612 s, estimated 11 s
Ran all test suites.

Этот вывод выглядит так, будто сначала выполняются тесты, а затем jest.setup.ts бег.

1 Ответ

0 голосов
/ 11 июля 2020

async функций, сырые обещания с then и done обратным вызовом - это 3 способа добиться того же самого в Jest. Их не следует смешивать без необходимости.

setUp - это async даром, он не связывает вложенные обещания. done вызывается синхронно в beforeAll, никакие обещания не влияют на результат, за исключением того, что они могут вызывать неперехваченные ошибки, потому что они не были связаны.

Это должно быть:

beforeAll(async () => {
  const first = new Promise((res, rej) => {
    res('this called first');
  })

  const second = new Promise((res, rej) => {
    res('this called second');
  });

  const firstRes = await first;
  console.log(firstRes);
  const secondRes = await second;
  console.log(secondRes);
})
...