6

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

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

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

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

赛普拉斯尝试向此 url 发出 http 请求时出错: https://localhost:4200/api/testing

错误是:

套接字超时

堆栈跟踪是:

错误:
ClientRequest 处的 ESOCKETTIMEDOUT。(...\node_modules\cypress\dist\Cypress\resources\app\packages\server\node_modules\request\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)

将 a 添加responseTimeout到赛普拉斯的全局配置会增加超时,但为什么不是超时visitwait发生的超时?

4

2 回答 2

3

请参阅此页面上的代码示例命令 - 等待 - 别名

// 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) =>到您的代码中,看看会得到什么响应。

逻辑上说,如果虚假路由等待完全超时,但“失败的合法路由”没有,则在超时期限内从服务器发回带有故障代码的响应。


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 错误处理程序添加到失败的命令。

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

于 2018-04-01T21:51:59.970 回答
1

.vist() 和 .wait() 对我不起作用,cypress 上的错误日志建议使用 .request() 代替它可以正常工作。

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

于 2019-05-28T09:33:39.877 回答