首页 > 解决方案 > 赛普拉斯 cy.wait 不适用于 AWS CodeBuild

问题描述

我使用 Cypress (v 4.12.1) 为我的 React App 编写了一些集成测试。我在 AWS 上有一个 CI/CD,我需要在其中集成它们。涉及的产品有 GitHub(源存储库)、AWS CodePipeline、AWS CodeBuild。

如果我必须测试一页的方面,赛普拉斯测试成功。如果测试涉及 API 调用,并且我必须使用该cy.wait()函数,我得到的错误是:

CypressError: `cy.wait()` timed out waiting `5000ms` for the 1st request to the route: `agreements`. No request ever occurred.

我检查了我的服务器日志,我看到收到的 API 请求,所以问题是赛普拉斯不知道 API 调用是否已经进行。然后我在 GitHub https://github.com/cypress-io/cypress/issues/3427上发现了这个问题,但我发现的建议是我正在使用的建议:

  • 确保 cy.server() 和 cy.route() 在您 cy.visit() 之前或在您执行将导致 XHR 请求发出的操作之前定义。
  • 如果需要,请确保在 cy.route() 上定义方法。cy.wait() 默认只自动监听 GET 请求。

在这里您可以找到为我的集成测试编写的代码:

context("Test Page", () => {
  before(() => {
    cy.server();
    cy.route({
      method: "POST",
      url: `https://myserver.com/${Cypress.env("ENV")}/login`,
      status: 201,
    }).as("login");

    process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
    cy.visit("http://localtest.myserver.com:3000/test_page");
    // Dismiss cookie message
    cy.get("[data-cy=dialog-actions]").find("button").click();
    cy.log('Cookie message dismissed');
  });

  it("landed on the agreements page", () => {
    cy.bypassLogin().then((xhr) => {
      LOGIN_ID = xhr.body["loginId"];
      cy.route({
        method: "GET",
        url: `https://myserver.com/${Cypress.env("ENV")}/login/${LOGIN_ID}/agreements`,
        status: 200,
      }).as("agreements");
    });

    cy.wait("@agreements").then((xhr) => {
      NUM_AGREEMENTS = xhr.response.body.length;
      let requiredAgreements = [];
      let notRequiredAgreements = [];

      xhr.response.body.forEach((elem, idx) => {
        elem.isRequired
          ? requiredAgreements.push(idx)
          : notRequiredAgreements.push(idx);
      });

      IDX_REQUIRED_AGREEMENTS = requiredAgreements;
      IDX_NOT_REQUIRED_AGREEMENTS = notRequiredAgreements;

      expect(xhr.status).to.eq(200);
    });
  });

有人可以帮我解决这个问题吗?

标签: node.jsamazon-web-servicescypressaws-codebuild

解决方案


推荐阅读