开玩笑 - 类型错误:response.json 不是函数

Bob*_*ane 0 javascript json jestjs react-native fetch-api

我们正在对 React-Native 应用程序(使用 Jest)进行单元测试,该应用程序使用fetch.

\n

fetch为了测试它们,我们模拟了 API 调用函数中的调用。到目前为止效果很好。我们还有组合这些 API 调用并对其进行一些逻辑操作的函数。

\n

例如,下面是一个函数,给定令牌后,该函数将获取相关用户的第一个项目 ( project[0]) 并返回该项目中的项目列表。

\n
export async function getAllItems(token) {\n  try {\n    const response = await getCurrentUser(token); // fetch called inside\n    const responseJson = await response.json();\n    const allItemsResp = await getAllItemsFromSpecificProject(\n      token,\n      responseJson.projectIds[0],\n    );                                            // fetch called inside\n    return await allItemsResp.json();\n  } catch (error) {\n    console.log(error);\n    return null;\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

函数getCurrentUsergetAllItemsFromSpecificProject都是简单的fetch调用,目前已正确模拟。这是一个尝试测试该getAllItems功能的测试:

\n
it('Gets all items', async () => {\n  getAccessTokenMockFetch();\n  const token = await getAccessToken('usherbrooke@powertree.io', 'test!23');\n\n  getAllItemsMockFetch();\n  const items = await getAllItems(token.response.access_token);\n\n  expect(items.response.length).toEqual(3);\n});\n
Run Code Online (Sandbox Code Playgroud)\n

为了清楚起见,这里是如何getAccessTokenMockFetch完成的。getAllItemsMockFetch几乎相同(响应中的数据不同):

\n
function getAccessTokenMockFetch() {\n  global.fetch = jest.fn().mockImplementation(() => {\n    promise = new Promise((resolve, reject) => {\n      resolve(accepted);\n    });\n\n    return promise;\n  });\n}\n
Run Code Online (Sandbox Code Playgroud)\n

其中accepted包含成功调用的JSON内容。当我们运行此测试时,我们收到以下错误:

\n
TypeError: Cannot read property 'response' of null\n
Run Code Online (Sandbox Code Playgroud)\n

而我们console.log这一点就在其中:

\n
TypeError: response.json is not a function\n
Run Code Online (Sandbox Code Playgroud)\n

这解释了为什么响应是null. 看来这个json()调用不被理解,我不知道如何嘲笑它。我对 Stack\xc2\xa0Overflow 及其他方面进行了大量研究,但我们没有发现任何内容可以帮助我理解如何解决这个问题。这可能表明我在这方面走错了路,这很有可能,因为我是 JavaScript、React Native 和 Jest 的新手。

\n

Emi*_*man 5

可以尝试的一件事是给它一个假的json调用,如下所示:

const mockFetch = Promise.resolve({ json: () => Promise.resolve(accepted) });
global.fetch = jest.fn().mockImplementation(() => mockFetchPromise);
Run Code Online (Sandbox Code Playgroud)