使用 Jest 模拟 API 错误响应时在组件中未定义提取
Fetch is Undefined in Component when Mocking API Error Response with Jest
我正在测试一个组件,该组件使用 useEffect
挂钩从 API 获取数据,更新状态,然后构建组件。我已经使用 作为示例成功模拟了 API 响应以进行多次测试。我现在正在尝试编写一个测试,我模拟从 API 返回的错误。我收到一条错误消息,指出 TypeError: Cannot read property 'then' of undefined
对应 fetch
。我正在尝试使用相同的示例,但没有成功。
我成功获取测试数据的模拟如下所示:
global.fetch = jest.fn().mockImplementationOnce(() =>
Promise.resolve({
json: () => Promise.resolve(successMockData),
})
)
我尝试的模拟错误响应目前看起来像:
global.fetch = jest.fn().mockImplementationOnce(() => {
Promise.resolve({
status: 400,
json: () => Promise.resolve({ success: false, error: 'Something bad happened' }),
})
})
我在 运行 测试时得到的错误是:
如果我拒绝承诺,我仍然会得到同样的错误,但也会抛出异常:
global.fetch = jest.fn().mockImplementationOnce(() => {
Promise.reject({
status: 400,
json: () => Promise.resolve({ success: false, error: 'Something bad happened' }),
})
})
API 使用 NextApiResponse,如下所示:
try {
// Query data from database
const data = methodThatGetsDataFromDatabase()
return res.status(200).json({ success: true, data: data })
} catch (error) {
return res.status(400).json({ success: false, error: error.message })
}
我已经在这方面工作了很长时间,并且已经厌倦了 Google 寻找答案。我只是想不通为什么 fetch
是未定义的而不是返回承诺。非常感谢任何帮助!
我发现的不同之处在于,您成功获取的模拟实际上是 returns Promise。
但是失败的提取模拟没有返回——请注意在 Promise 周围微妙地添加了大括号。你能在没有大括号的情况下检查这个吗?
global.fetch = jest.fn().mockImplementationOnce(() =>
Promise.resolve({
status: 400,
json: () => Promise.resolve({ success: false, error: 'Something bad happened' }),
})
)
我正在测试一个组件,该组件使用 useEffect
挂钩从 API 获取数据,更新状态,然后构建组件。我已经使用 TypeError: Cannot read property 'then' of undefined
对应 fetch
。我正在尝试使用相同的示例,但没有成功。
我成功获取测试数据的模拟如下所示:
global.fetch = jest.fn().mockImplementationOnce(() =>
Promise.resolve({
json: () => Promise.resolve(successMockData),
})
)
我尝试的模拟错误响应目前看起来像:
global.fetch = jest.fn().mockImplementationOnce(() => {
Promise.resolve({
status: 400,
json: () => Promise.resolve({ success: false, error: 'Something bad happened' }),
})
})
我在 运行 测试时得到的错误是:
如果我拒绝承诺,我仍然会得到同样的错误,但也会抛出异常:
global.fetch = jest.fn().mockImplementationOnce(() => {
Promise.reject({
status: 400,
json: () => Promise.resolve({ success: false, error: 'Something bad happened' }),
})
})
API 使用 NextApiResponse,如下所示:
try {
// Query data from database
const data = methodThatGetsDataFromDatabase()
return res.status(200).json({ success: true, data: data })
} catch (error) {
return res.status(400).json({ success: false, error: error.message })
}
我已经在这方面工作了很长时间,并且已经厌倦了 Google 寻找答案。我只是想不通为什么 fetch
是未定义的而不是返回承诺。非常感谢任何帮助!
我发现的不同之处在于,您成功获取的模拟实际上是 returns Promise。
但是失败的提取模拟没有返回——请注意在 Promise 周围微妙地添加了大括号。你能在没有大括号的情况下检查这个吗?
global.fetch = jest.fn().mockImplementationOnce(() =>
Promise.resolve({
status: 400,
json: () => Promise.resolve({ success: false, error: 'Something bad happened' }),
})
)