我们正在对React-Native应用程序(使用Jest)进行单元测试,该应用程序使用fetch
进行各种API调用。为了测试它们,我们在API调用函数中模拟了对fetch
的调用。到目前为止,效果很好。我们还有结合这些API调用并对其进行一些逻辑处理的函数。例如,这是一个函数,给定一个令牌,该函数将获取相关用户的第一个项目(project[0]
)并从该项目返回项目列表。
export async function getAllItems(token) {
try {
const response = await getCurrentUser(token); // fetch called inside
const responseJson = await response.json();
const allItemsResp = await getAllItemsFromSpecificProject(
token,
responseJson.projectIds[0],
); // fetch called inside
return await allItemsResp.json();
} catch (error) {
console.log(error);
return null;
}
}
函数getCurrentUser
和getAllItemsFromSpecificProject
都是简单的fetch
调用,目前已被正确模拟。这里是一个尝试测试getAllItems
函数的测试:
it('Gets all items', async () => {
getAccessTokenMockFetch();
const token = await getAccessToken('usherbrooke@powertree.io', 'test!23');
getAllItemsMockFetch();
const items = await getAllItems(token.response.access_token);
expect(items.response.length).toEqual(3);
});
为清楚起见,这是getAccessTokenMockFetch
的完成方式。 getAllItemsMockFetch
几乎相同(响应中有不同的数据):
function getAccessTokenMockFetch() {
global.fetch = jest.fn().mockImplementation(() => {
promise = new Promise((resolve, reject) => {
resolve(accepted);
});
return promise;
});
}
接受的包含成功调用的JSON内容。当我们运行此测试时,会出现以下错误:
TypeError: Cannot read property 'response' of null
然后我们console.log
抓住了这个:
TypeError: response.json is not a function
解释了为什么响应为null
。似乎无法理解json()
调用,而且我也不知道该如何模拟它。我已经对SO以及其他方面进行了大量研究,但是没有发现任何可以帮助我理解如何解决此问题的方法。这可能表明我对此采取了错误的方法,这很可能,因为我是Javascript,React-Native和Jest的新手。
在此问题上的任何帮助将不胜感激。
答案 0 :(得分:1)
要尝试的一件事是给它一个假的json来调用,就像这样:
const mockFetch = Promise.resolve({ json: () => Promise.resolve(accepted) });
global.fetch = jest.fn().mockImplementation(() => mockFetchPromise);