赛普拉斯访问和等待超时被忽略

时间:2018-03-30 19:31:31

标签: timeout e2e-testing cypress

我创建了一个测试,我设置了一个路由,尝试访问一个向路由发出API请求的页面,然后等待路由响应:

cy
    .server()
    .route('GET', '/api/testing')
    .as('testing');
cy.visit('/index.html', { timeout: 60000 });
cy.wait('@testing', { timeout: 60000 });

这只等待赛普拉斯全局默认responseTimeout 30秒,然后API请求失败。

这是赛普拉斯在控制台中记录的错误消息:

  

赛普拉斯错误地尝试向此网址发出http请求:   https://localhost:4200/api/testing

     

错误是:

     

ESOCKETTIMEDOUT

     

堆栈跟踪是:

     

错误:ESOCKETTIMEDOUT
      在ClientRequest。 (... \ node_modules \桧\ DIST \赛普拉斯\资源\程序\包\服务器\ node_modules \请求\ request.js:778:19)
      在Object.onceWrapper(events.js:314:30)
      在emitNone(events.js:105:13)
      在ClientRequest.emit(events.js:207:7)
      在TLSSocket.emitTimeout(_http_client.js:722:34)
      在Object.onceWrapper(events.js:314:30)
      在emitNone(events.js:105:13)
      在TLSSocket.emit(events.js:207:7)
      在TLSSocket.Socket._onTimeout(net.js:402:8)       在ontimeout(timers.js:469:11)
      在tryOnTimeout(timers.js:304:5)
      在Timer.listOnTimeout(timers.js:264:5)

responseTimeout添加到赛普拉斯的全局配置会增加超时,但为什么visitwait的超时时间不会出现?

3 个答案:

答案 0 :(得分:0)

请参阅此页面上的代码示例commands - wait - Alias

// Wait for the route aliased as 'getAccount' to respond
// without changing or stubbing its response
cy.server()
cy.route('/accounts/*').as('getAccount')
cy.visit('/accounts/123')
cy.wait('@getAccount').then((xhr) => {
  // we can now access the low level xhr
  // that contains the request body,
  // response body, status, etc
})

我会将then((xhr) =>添加到您的代码中,看看会有什么响应。

逻辑说,如果虚假路线等待完全超时,但是合法路线失败了#39;如果没有,则在超时期限内从服务器发回失败代码的响应。

request.js中出现错误的代码块有一个有趣的注释。

self.req.on('socket', function(socket) {
  var setReqTimeout = function() {
    // This timeout sets the amount of time to wait *between* bytes sent
    // from the server once connected.
    //
    // In particular, it's useful for erroring if the server fails to send
    // data halfway through streaming a response.
    self.req.setTimeout(timeout, function () {
      if (self.req) {
        self.abort()
        var e = new Error('ESOCKETTIMEDOUT')  <-- LINE 778 REFERENCED IN MESSAGE
        e.code = 'ESOCKETTIMEDOUT'
        e.connect = false
        self.emit('error', e)
      }
    })
  }

这可能是您要测试的条件(即连接中断响应) 不幸的是,似乎没有语法cy.wait().catch(),请参阅Commands-Are-Not-Promises

  

您无法将失败的命令添加.catch错误处理程序。

您可能想尝试对路由进行存根而不是在服务器上设置断点,但我不确定假响应应该采用什么形式。 (参考route with stubbing

答案 1 :(得分:0)

尝试将timeout设置为1e9并查看是否仍然超时

答案 2 :(得分:0)

.vist()和.wait()对我不起作用,建议使用.request()代替cypress上的错误日志,但效果很好。

cy.server(); 
cy.request('/api/path').then((xhr) => {
  console.log(xhr.body)
})