Как избежать повторного запуска асинхронного вызова API для каждого теста Jest? - PullRequest
1 голос
/ 11 октября 2019

Я хочу написать тест для асинхронной функции, которая извлекает данные из внешнего API.

Документация Jest говорит мне вернуть обещание для тестового примера, например:

test('the data is peanut butter', () => {
  return fetchData().then(data => {
    expect(data).toBe('peanut butter')
  })
})

Моя проблема с этим подходом состоит в том, что он делает отдельный вызов fetchData для каждого теста. Но нет никакой гарантии, что два вызова API вернут одни и те же данные, поэтому каждый тестовый пример может выполняться для другого набора данных.

Я хотел бы сделать вызов fetchData один раз, а затем выполнить все моитестирует те же данные ответа - что-то вроде этого:

describe('fetchData works as expected', () => {
  fetchData().then(data => {

    // test1
    test('the data is peanut butter', () => {
      expect(data).toBe('peanut butter')
    })

    // test2
    test('the data is peanut butter', () => {
      expect(data).toBe('peanut butter')
    })
  })
})

Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

Вам необходимо добавить блок beforeAll, который будет запускаться только один раз для всех тестовых случаев. Таким образом, вы можете добавить свою функцию fetchData() в этот блок и присвоить результат fetchData() в глобальной переменной, к которой затем могут обращаться все тестовые примеры. Что-то вроде:

let fetchData;
beforeAll(() => {
  return fetchData().then(data => {
    fetchData = data;
  })
});

// test1
test('the data is peanut butter', () => {
  expect(fetchData).toBe('peanut butter')
})

// test2
test('the data is peanut butter', () => {
  expect(fetchData).toBe('peanut butter')
})
1 голос
/ 11 октября 2019

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

{
...
setupFiles: ['putYourFunctionHereOrBelow'],
setupFilesAfterEnv: ['./src/services/test/getApiTestResponse.ts'],
testMatch: ['<rootDir>/src/**/*.spec.ts'],
... 

}

Вы также можете сделать свой getApiTestResponse одиночным, чтобы он вызывал API только один раз

let peanutButterData;

export const getApiTestResponse = async () => {
 if (!peanutButterData) {
   peanutButterData = await fetchData().then(data => data)
 }
 return Promise.resolve(peanutButterData);
}

Если вы хотите запустить код один раз вкаждый тестовый файл вы можете структурировать свой файл как

beforeAll(() => {
 const myPeanutButterData = getApiTestResponse();
});

describe('it does peanut butter things', () => {
  ...
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...