Javascript Cypress函数随机超时“;从未解决的承诺。”;

Javascript Cypress函数随机超时“;从未解决的承诺。”;,javascript,authentication,cypress,Javascript,Authentication,Cypress,我正在覆盖visit命令,以便在需要身份验证的QA环境上运行测试。大多数情况下,它工作正常,但有时会失败 cy.then()在等待4000毫秒后超时 您的回调函数返回了一个从未解决的承诺 我的职能是: Cypress.Commands.overwrite("visit", (originalFn, url, options) => { // Read the auth details from accounts.json cy.fixture("acc

我正在覆盖visit命令,以便在需要身份验证的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.visit()

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

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

您可以使用composition并添加新命令

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);
  });
});

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

此功能的目的是什么?它正在返回
originalFn
的结果,但随后
cy.fixture
返回值未被使用?authenticatedOptions被传递到originalFn,它包含站点访问时要求的身份验证用户名和密码。它正在这样做,但不是每次调用visit时都传递它,而是覆盖函数以自动执行。cypress如何知道承诺何时完成?这可能就是它超时的原因我不确定,根据文档,它在调用时不应该超时。有一点看起来很可疑,那就是您从
回调返回
。然后()
回调,但您不会从
覆盖
回调返回该承诺,所以
visit
不会知道它应该等待fixture。