【问题标题】:Cypress function randomly times out "promise that never resolved."赛普拉斯函数随机超时“从未解决的承诺”。
【发布时间】:2021-05-05 19:35:52
【问题描述】:

我正在覆盖访问命令以在需要身份验证的 QA 环境中运行测试。大多数时候它工作正常,但有时它会失败

cy.then() 等待 4000 毫秒后超时。

您的回调函数返回了一个从未解决的承诺。

我的功能是:

Cypress.Commands.overwrite("visit", (originalFn, url, options) => {
  // Read the auth details from accounts.json
  cy.fixture("accounts").then((account) => {
    const username = account.auth_username;
    const password = account.auth_password;

    const authenticatedOptions = {
      ...options,
      auth: { username, password },
      failOnStatusCode: false,
    };

    return originalFn(url, authenticatedOptions);
  });
});

我做错了什么让它变得脆弱吗?

【问题讨论】:

  • 这个函数的目的是什么?它正在返回originalFn 的结果,但是cy.fixture 返回值没有被使用?
  • authenticatedOptions 被传递给 originalFN,它包含站点在您访问它时要求的身份验证用户名和密码。 docs.cypress.io/api/commands/visit#Add-basic-auth-headers 它正在这样做,但不是在每次调用 visit 时都将其传递,而是覆盖了函数以自动完成
  • 赛普拉斯如何知道承诺何时完成?这可能就是超时的原因
  • 我不确定,根据文件,它在调用 .fixture docs.cypress.io/api/commands/fixture#Timeouts时永远不会超时
  • 看起来阴暗的是你从 .then() 回调中 return,但你没有从 overwrite 回调中返回那个承诺,所以 visit 不会知道它应该等待夹具。

标签: javascript authentication cypress


【解决方案1】:

覆盖命令可能有点狡猾,调用originalFn() 时的行为并不总是与作为命令调用时相同,例如cy.visit()

失败可能是因为访问失败(即调用originalFn(url, authenticatedOptions)由于某种原因失败)。但是originalFn() 返回一个 Promise,它应该在失败时被拒绝,但事实并非如此。

当你调用一个错误的 URL 时,比如 cy.visit('http://example-not-valid.com'),没有覆盖 Cypress 会给你一个相当不错的消息。随着覆盖它只是一个未解决的承诺。

您可以使用合成并添加新命令

Cypress.Commands.add("visitWithAuthentication", (url, options) => {

  cy.fixture("accounts").then((account) => {
    const username = account.auth_username;
    const password = account.auth_password;

    const authenticatedOptions = {
      ...options,
      auth: { username, password },
      failOnStatusCode: false,
    };

    cy.visit(url, authenticatedOptions);
  });
});

这将为您提供正确的消息,但在从 DEV 切换到 QA 环境时可能不方便。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多