1

所以我正在为我的一个反应项目编写测试,我只是决定使用模拟服务工作者来模拟我的 api 调用,我试图模拟一个登录端点。所以我试图模拟一个登录错误,我返回一条错误消息当输入与特定电子邮件不匹配时。给定下面的代码;

const server = setupServer(
  rest.post("https://testlogin.com/api/v1/login", (req, res, ctx) => {
    // the issue is getting the email from the request body something like the code just below
    if (req.body["email"] != "test@example.com") {
      ctx.status(401);
      return res(
        ctx.json({
          success: false
        })
      );
    }
  })
);

我怎样才能做到这一点?有没有更好的方法来做到这一点?

4

1 回答 1

2

给定您的请求设置header,您应该能够获得该req.body.email值。如果没有 Content-Type 标头,MSW 和您的实际服务器都无法知道您尝试发送什么样的数据(如果有的话,它可以是二进制文件!)。通过提供正确的 Content-Type 标头,您可以形成正确的请求,但也让 MSW 确保应该将其解析为对象。Content-Type: application/jsonreq.body

// your-code.js
fetch('https://testlogin.com/api/v1/login', {
  method: 'POST',
  headers: {
    // Adding this header is important so that "req.body"
    // is parsed into an object in your request handler.
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ login: 'admin@site.com' })
})
// your-handlers.js
rest.post('https://testlogin.com/api/v1/login', (req, res, ctx) => {
  const { login } = req.body

  if (login !== 'test@example.com') {
    return res(ctx.status(401), ctx.json({ success: false }))
  }

  return res(ctx.json({ success: true }))
})

注意ctx.status(401)调用是如何在函数调用内部的。res()调用ctx[abc]外部的任何方法都res不会产生任何效果,因为它们依赖于包裹在res.

于 2021-12-04T00:51:57.570 回答