Cypress.io 在自定义登录命令中发出异步请求

xtr*_*tra 6 javascript testing promise async-await cypress

我想配置一个自定义login命令,在其中我必须进行一个返回承诺的登录调用。

commands.js:

Cypress.Commands.add("login", () => {
  AuthLib.signIn(username, password).then((data) => {
    cy.setLocalStorage("accessToken", data.accessToken);
  });
Run Code Online (Sandbox Code Playgroud)

AuthLib.signIn()返回一个承诺。

然后我想在块中使用这个命令before

  before(() => {
    cy.login();
    cy.saveLocalStorage();
  });
Run Code Online (Sandbox Code Playgroud)

我注意到承诺没有得到解决。一个“hacky”修复方法是在和cy.wait(4000)之间添加。但这使得我的测试取决于身份验证服务器的加载时间login()saveLocalStorage()

我发现了这个“相关”问题:Cypress.io 如何处理异步代码,其中引用了https://www.npmjs.com/package/cypress-promise 。但这个库不能用于beforebeforeEach

我如何等待返回的承诺/确保在执行之前解决login()承诺?login()cy.saveLocalStorage()

更新

我添加了哪些有效和无效的示例:https://github.com/Nxtra/Cypress-Amplify-Auth-Example/blob/main/cypress/support/commands.js

解决方案是从以下开始cy.then()

Cypress.Commands.add("login", () => {
  cy.then(() => AuthLib.signIn(username, password)).then((data) => {
    cy.setLocalStorage("accessToken", data.accessToken);
  });
Run Code Online (Sandbox Code Playgroud)

oKo*_*nyk 1

确保您在Cypress.Commands.add回调中返回该承诺。在 Cypress 上下文中处理 Promise 有点令人困惑,因为很多异步行为都是在 cy 中神奇地处理的。命令。

Cypress.Commands.add("login", () => {
  return AuthLib.signIn(username, password).then((data) => {
    cy.setLocalStorage("accessToken", data.accessToken);
  });
});
Run Code Online (Sandbox Code Playgroud)

其他解决方案:

Cypress.Commands.add("login", () => {
  return AuthLib.signIn(username, password);
});

before(() => {
  cy.login();
  cy.setLocalStorage("accessToken", data.accessToken);
});
Run Code Online (Sandbox Code Playgroud)