使用 mock service worker 测试 React App 时如何记录请求数?

Posted

技术标签:

【中文标题】使用 mock service worker 测试 React App 时如何记录请求数?【英文标题】:How to keep a count of number of requests when using mock service worker to test a React App? 【发布时间】:2021-07-15 23:17:33 【问题描述】:

在我的应用程序中,用户输入他们的出生日期,发送一个请求,如果它与数据库中的出生日期匹配,他们将被发送到下一页。如果不匹配,则会向他们显示他们在链接不再有效之前剩余的尝试次数。他们尝试了 3 次。

我的问题是,我将如何使用模拟服务工作者来模拟此功能?我需要记录这个请求被尝试和失败的次数。

这里是处理程序的代码 sn-p,你可以看到我现在在“验证尝试”之后硬编码了“1”。

rest.post(
    'https://myapiaddress/auth',
    (req, res, ctx) => 
      const enteredDateOfBirth = req.body.data.date_of_birth
      let returnResult
      if (enteredDateOfBirth === '1988-10-01') 
        returnResult = res(
          ctx.status(200),
          ctx.json(
            data: 
              basic: 'fdafhaioubeaufbaubsaidbnf873hf8faoi'
            
          )
        )
       else 
        returnResult = res(
          ctx.status(400),
          ctx.json(
            errors: [
               code: 89, message: 'Wrong date of birth. Auth attempts: 1' 
            ]
          )
        )
      
      return returnResult
    
  )
]

我在其中确认错误日期 3 次的开玩笑测试:

// 1st attempt
  userEvent.click(confirmBtn)
  const warningAttemptsNum1 = await screen.findByText('1/3 attempts')
  const dateEntered = screen.getByText('(12/10/2010)')
  expect(warningAttemptsNum1).toBeInTheDocument()
  expect(dateEntered).toBeInTheDocument()
  // 2nd attempt
  userEvent.click(confirmBtn)
  const warningAttemptsNum2 = await screen.findByText('2/3 attempts')
  expect(warningAttemptsNum2).toBeInTheDocument()
  userEvent.click(confirmBtn)

  // Entering 3 times shows "link no longer valid" screen
  userEvent.click(confirmBtn)
  const linkNoLongerValidText = await screen.findByText(
    'This link is no longer valid'
  )
  expect(linkNoLongerValidText).toBeInTheDocument()

【问题讨论】:

【参考方案1】:

您的总体想法是正确的:您可以通过在响应解析器中增加一个数字来跟踪请求的计数。

我建议这样做:

function withTimes(handler) 
  let attempts = 0
  return (req, res, ctx) => 
    attempts++
    handler(req, res, ctx, attempts)
  


rest.post('/endpoint', withTimes((req, res, ctx, attempts) => 
  const MAX_ATTEMPTS = 3
  const dob = req.body.data.date_of_birth

  if (dob === '1988-10-01') 
    return res(ctx.json( data:  basic: 'abc-123' ))
  

  return res(
    ctx.status(400),
    ctx.json(
      errors: [
        
          code: 89,
          message: `Wrong date of birth. Attempts left: $MAX_ATTEMPTS - attempts`
        
      ]
    )
  )
))

我还看到您使用的响应体结构非常类似于 GraphQL。请注意,您应该使用GraphQL API 来处理 GraphQL 操作。

【讨论】:

以上是关于使用 mock service worker 测试 React App 时如何记录请求数?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Mock Service Worker 在自定义钩子中模拟获取?

Jest 使用 Mock Service Worker (MSW) 或其他模拟离线网络?

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

Python接口测试实战5(下) - RESTfulWeb Service及Mock Server

Mock单元测试

Mock测试框架(Mockito为例)