Testcafe 使您能够模拟请求的响应,我也能做到。
我想为所有 GET/Ajax 请求实现一个缓存系统。
如果 URL 在缓存中,则此方法可以正常工作,但对于不在缓存中的 URL,它会返回空响应。
这是因为(我想)我没有在缓存中找不到的那些 URL 上调用 res.setBody()。
export const requestMock = RequestMock()
.onRequestTo({ method: 'GET', isAjax: true })
.respond(async (req: Request, res: Response & { setBody: Function }) => {
const url: string = req.url
try {
const body: string = await cache.getItem(url)
if (body) {
res.setBody(body)
}
} catch (error) {
print.error(error)
}
})
我怎样才能得到原版
Response.body
这样我就可以res.setBody(originalBody)
?
这需要您的代码首先实际获取数据并将其添加到缓存以供将来的请求。 但这不是嘲笑,这只是缓存。
考虑使用实际的模拟,例如将请求响应存储在某些 JSON 文件(或您在其中使用的任何格式)中,并在测试的应用程序尝试向特定 URL 发出请求时返回该文件的内容。
如果您仍然想使用缓存解决方案,在
respond
回调中,您的代码应该检查缓存中是否有对该 URL 的响应。如果是,则从缓存返回正文(就像您现在正在做的那样)。如果没有,则发出此请求,将响应添加到缓存并返回响应。
要发出请求,您可以使用
fetch
API(浏览器)或使用一些库,如 axios
(Node.js 运行时)。