如何使用 msw 有条件地模拟错误响应

Posted

技术标签:

【中文标题】如何使用 msw 有条件地模拟错误响应【英文标题】:How to conditionally mock error responses with msw 【发布时间】:2021-07-17 03:48:16 【问题描述】:

我正在处理的 UI 会根据收到的响应以不同方式呈现。我想在收到 4xx5xx 响应时测试 UI。

我的 api 处理程序看起来像:

import  rest  from 'msw';
import  items  from './apiValues';

export const handlers = [
  rest.get('/items/', (_req, res, ctx) => res(ctx.status(200), ctx.json(items))),
];

这将始终返回 2xx 响应,使其无法在收到 4xx5xx 响应时测试 UI,除非我手动更改处理程序,这很累。

如何测试4xx5xx 响应的测试?

【问题讨论】:

情况是什么样的? 我试图弄清楚如何使用相同的 url 返回不同的响应,例如成功的响应 rest.get('/items/', (_req, res, ctx) => res(ctx.status(200), ctx.json(items))) 和不成功的响应 rest.get('/items/', (_req, res, ctx) => res.networkError('Network error')) 那么我如何选择成功或不成功的响应时测试请求依赖组件。 【参考方案1】:

使用搜索参数来控制get 请求的响应。

req.body 中传递一个变量来控制post 请求的响应是否成功。

见Conditional response

import  setupWorker, rest  from 'msw';

const worker = setupWorker(
  rest.get('/items/', (req, res, ctx) => 
    const error = req.url.searchParams.get('error')
     
    // error response
    if(error === 'network') 
      return res(
        ctx.status(200),
        ctx.json(
          errorMessage: 'Network error',
        ),
      )
    

    // successful response
    return res(ctx.status(200), ctx.json(items));
  ),
)

【讨论】:

由于无法在 get 请求中传递正文,它将如何处理 get 请求。 @TimothyOliver 更新了答案。

以上是关于如何使用 msw 有条件地模拟错误响应的主要内容,如果未能解决你的问题,请参考以下文章

使用 MSW 和 Jest 时如何在请求之间的测试中清除 RTK 查询缓存?

如何将 Service Worker 库 (MSW) 与 Parcel 捆绑器一起使用

使用 Mock Service Worker 时如何对 graphql 查询变量进行断言?

如何修复“未捕获的错误:查询不再有模拟响应”

在 axios 响应做出反应后,如何有条件地重定向到页面?

Excel - 有条件地隐藏错误