我想编写一个用于从外部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')
})
})
})
我该怎么做?
答案 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', () => {
...
});