发生500 xhr请求时失败的赛普拉斯测试

时间:2019-04-30 11:06:06

标签: e2e-testing cypress

我正在cypress中编写Web应用程序的端到端测试,如果这些应用程序发送任何带有http 500错误响应的请求,我希望cypress无法通过测试。

我正在3.1.5版中使用cypress。我已经尝试了以下方法,但是遇到了Promise错误。

    cy.server();
    cy.route({
      url: '**',
      onResponse: (xhr) => {
        cy.log(xhr);
      }
    });

我希望找到一个解决该问题的更优雅的方法,因为在我看来这听起来像是一个非常标准的用例。

3 个答案:

答案 0 :(得分:1)

尝试使用以下代码参考 doc

  cy.intercept('**').as('all')

  cy.wait('@all').its('response.statusCode').should('not.be.oneOf', [500])

使用 - should('be.oneOf', [200,300])

检查状态代码
  cy.wait('@all').its('response.statusCode').should('be.oneOf', [200,300])

答案 1 :(得分:0)

不确定是否有某种规范的方法,但是您可以猴子修补XMLHttpRequest API并引发>= 500状态响应。

如果您的应用程序使用Fetch API,SendBeacon或其他功能,则可以执行类似的操作。

// put this in support/index.js
Cypress.on('window:before:load', win => {
    const origSend = win.XMLHttpRequest.prototype.send;
    win.XMLHttpRequest.prototype.send = function () {
        // deferring because your app may be using an abstraction (jquery),
        // which may set this handler *after* it sets the `send` handler
        setTimeout(() => {
            const origHandler = this.onreadystatechange;
            this.onreadystatechange = function () {
                if ( this.readyState === 4 && this.status >= 500 ) {
                    throw new Error(`Server responded to "${this.url}" with ${this.status}`);
                }
                if ( origHandler ) {
                    return origHandler.apply(this, arguments);
                }
            };
            return origSend.apply(this, arguments);
        });
    };
});

WTBS,它不是很有用,因为您的应用可能想代替处理500,但这会阻止它。

更好的解决方案是确保您的应用仅引发未处理的500个响应。

答案 2 :(得分:0)

您可以在应要求内抛出错误,这应该可以解决。

cy.server();
cy.route({
  url: '**',
  onResponse: (xhr) => {
    if(xhr.status === 500) {
        throw new Error('Failing test caused by a unhandled request with status 500')
    }
    cy.log(xhr);
  }
})