如何避免为每个Jest测试案例重新运行异步API调用?

时间:2019-10-11 12:01:06

标签: javascript asynchronous testing jestjs

我想编写一个用于从外部API提取数据的异步函数的测试。

Jest documentation告诉我为测试用例返回一个承诺,如下所示:

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 个答案:

答案 0 :(得分:2)

您需要添加一个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 :(得分:1)

您可以使用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', () => {
  ...
});