MSW 与 Jest(困惑)

Posted

技术标签:

【中文标题】MSW 与 Jest(困惑)【英文标题】:MSW with Jest (confusion) 【发布时间】:2021-12-21 04:50:46 【问题描述】:

我正在尝试测试一个调用 API 的组件,我遇到了 MSW,并认为这会很棒。

const server = setupServer(
    rest.get('http://localhost:3001/vote/test-slug', (req, res, ctx) =>
        res(ctx.delay(500), ctx.status(200), ctx.json( data: alreadyVoted: `1` )),
    ),
);

这是我设置来处理捕获的服务器。在后台我使用 fetch 在我的组件中进行 API 调用,它看起来像这样

apiFetchData = (params) => 
   const res = await fetch(url, options);
   const data = (await res.json()) || null;


   const response: fetchJsonResponse = 
        data,
        statusCode: res.status,
        error: res.status !== 200,
        success: res.status === 200,
    ;


我的组件有这样的 onload 使用效果:

const component = () => 
   useEffect(() => 
     async function voteCheck() 
            const result = await apiFetchData(
                'http://localhost:3001/vote/test-slug',
            );
            if (result.data.alreadyVoted) 
                setHasUserVoted(result.data.alreadyVoted);
            
            setLoading(false);
        
        voteCheck();
   , []);

当我运行测试时

await act(async () => 
   render(
     <VoteButton />,
   );
);

我的 apiFetchData 出现以下错误

UseEffect result 
      data: 
        error: 'invalid json response body at  reason: Unexpected end of JSON input'
      ,
      hasData: false,
      statusCode: 500,
      error: true,
      errorType: 'application'
    

(我正在使用 jest-mock-fetch)我得到的结果是这样的

Response 
      size: 0,
      timeout: 0,
      [Symbol(Body internals)]:  body: <Buffer >, disturbed: false, error: null ,
      [Symbol(Response internals)]: 
        url: undefined,
        status: 200,
        statusText: 'OK',
        headers: Headers  [Symbol(map)]: [Object: null prototype] ,
        counter: undefined
      
    

我被卡住了,似乎 MSW 正在捕获来自组件的请求,但我得到的响应似乎 100% 对提取无效,我不知道出了什么问题。任何帮助/提示将不胜感激。

编辑:我的 setupServer 代码中的错字

【问题讨论】:

【参考方案1】:

好的,所以,我终于找到了解决方案。

https://giters.com/mswjs/msw/issues/686 发现了这个,它解释了我遇到的同样的问题。把我们的我需要'polyfill'获取。 (TBH 在现阶段不确定这意味着什么)但在与此示例相关联的 cmets 中,特别是此 jest.setup:

https://github.com/mswjs/examples/blob/a8bb071d997a24f3a7f7107cbb414659c22ccc5a/examples/with-jest/jest.setup.js#L2

现在我有了import 'whatwg-fetch';,它按预期工作。

【讨论】:

是的,节点没有开箱即用的fetch()。很有趣,您在 JSON 上看到错误消息,而不是关于 fetch() 错过

以上是关于MSW 与 Jest(困惑)的主要内容,如果未能解决你的问题,请参考以下文章

React Jest 测试因 MSW 失败

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

jest.fn() 做啥以及如何使用它?

机器人工程的工作与考研之困惑→汇总篇←

每次测试都是Mock模块

覆盖与隐藏 Java - 困惑