javascript 在Cypress测试中Assert/检查存根请求的轮询速率

0kjbasz6  于 2023-01-11  发布在  Java
关注(0)|答案(1)|浏览(146)

我有一个Cypress测试,它使用带有cy.intercept的存根响应。我们拦截的请求是在后端轮询端点-我们每秒发出一个请求,直到响应中的状态属性发生变化。
我是Cypress的新手,所以我可能对您实际可以测试的内容有错误的想法,但是我想检查的是向此端点发出请求的频率,即Assert轮询以正确的速率(一次/秒)完成。
这可能与Cypress有关吗?或者我也许应该研究一些其他的工具?
下面是我们如何拦截网络呼叫(简化):

cy.intercept(
  {
    method: 'GET',
    path: '/api/user',
  },
  {
    body: {
      id: '1',
      status: 'UPDATED', // This is the status that eventually stops the polling
      // etc.
    },
  }
).as('getUserUpdated');

cy.intercept(
  {
    method: 'GET',
    path: '/api/user',
    times: 2,
  },
  {
    body: {
      id: '1',
      status: 'CREATED',
      // etc.
    },
  }
).as('getUserCreated');
jvlzgdj9

jvlzgdj91#

下面是一个简单的脚本,它以1秒的间隔轮询API大约10秒

<script>
  const intervalId = setInterval(() => {
    fetch('/api/user')
  }, 1000)

  setTimeout(() => {
    clearInterval(intervalId)
  }, 10_000)
</script>

如果我想用cy.intercept()测试它,我基本上会使用intercept的回调形式,并在其中记录时间。

cy.intercept('/api/user', req => {
  polls.push(Date.now() - last)
  last = Date.now()          // update the last time to record time between polls
  req.reply({ id: '1', status: 'UPDATED'})
})

但是第一个间隔时间被cy.visit()页面加载扭曲了,所以第二个cy.interval()可以捕获并丢弃它--但是您也可以只对polls数组执行.slice()操作。
注意设置cy.interval()的顺序-最后设置的是Cypress检查的第一个(然后由于{times:1},它在1次捕获后过期)。

let last = Date.now()
  
const polls = []
  
cy.intercept('/api/user', req => {
  polls.push(Date.now() - last)
  last = Date.now()
  req.reply({ id: '1', status: 'UPDATED'})
})
  
// This is just to consume the first call
// since the `cy.visit()` distorts the interval
cy.intercept('/api/user', { times: 1 }, req => {
  last = Date.now()
  req.reply({ id: '1', status: 'UPDATED'})
})
  
cy.visit('/');
cy.wait(10_000)
  .then(() => {
    cy.wrap(polls)
      .each(poll => {
        expect(poll).to.be.closeTo(1000, 50)      // best check is +/- 50 ms
      })
  })

相关问题