MSW(模拟服务工作者)是否可以传递未处理的请求但检查请求和响应?

问题描述 投票:0回答:1

使用 MSW 包裹 AUT 来进行模拟。

我希望能够“查看”我当前传递的未处理请求的响应。

不能使用 onUnhandledRequest (

res.passthrough()
) 来做到这一点,因为这只是告诉 MSW 您想要“通过”。

我考虑过使用“默认”处理程序,它将请求转发到所需的目的地,然后检查响应(实际上是将详细信息写入文件以供将来的测试检查),然后再传回 AUT 作为其响应。

但是,我无法弄清楚如何执行“默认”处理程序(即,如果请求与任何处理程序列表都不匹配,则使用“this”进行处理...)?

javascript handler msw
1个回答
0
投票

我实际上从 MSW 的人那里得到了答案。我把它放在这里以防其他人需要它(非常感谢 Artem Zakharchenko);

首先,onUnhandledRequest 函数无意以任何方式影响流量。这延伸到它无法观察实际响应,因为它超出了其预期范围。除了告诉 MSW 如何对未处理的请求做出反应之外,您不应该将此函数用于任何其他用途:抛出错误、警告您或不执行任何操作。将其视为位于请求解析算法之外的记录器自定义功能(这正是它的本质)。

您可以尝试在您的用例中使用

rest.all('*')
,但请记住,您无权访问那里的原始响应实例。但是,您可以在处理程序中按原样执行请求并检查代理响应。

rest.all('*', async (req, res, ctx) => {
  const proxyResponse = await ctx.fetch(req)
  console.log({ req, proxyResponse })
})

请注意,我不推荐此方法,因为它会影响传出流量。这会在处理现有请求的同时发出另一个请求,这不是您想要实现的目标。

解决方案

但是,我建议使用生命周期 API。它是专门为网络监控而设计的,有两种指定的观察响应的方法:

response:bypass

response:mocked

使用

response:bypass
事件对应用程序收到的未由请求处理程序处理的任何响应做出反应:

worker.events.on('response:bypass', (response, requestId) => {
  console.log('%d %s', response.status, response.statusText)
})

您在该监听器中获得 requestId 参数,它是一个 UUID,指向此响应背后的原始请求。您可以通过侦听 request:* 事件并按 ID 存储请求来关联请求和响应。在您的情况下,监听 request:unhandled 事件更有意义。

© www.soinside.com 2019 - 2024. All rights reserved.