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

Javascript io在自定义登录命令中发出异步请求,javascript,testing,promise,async-await,cypress,Javascript,Testing,Promise,Async Await,Cypress,我想配置一个自定义的login命令,在该命令中,我必须进行一个返回承诺的登录调用 commands.js: Cypress.Commands.add("login", () => { AuthLib.signIn(username, password).then((data) => { cy.setLocalStorage("accessToken", data.accessToken); }); AuthLib.signIn

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

commands.js

Cypress.Commands.add("login", () => {
  AuthLib.signIn(username, password).then((data) => {
    cy.setLocalStorage("accessToken", data.accessToken);
  });
AuthLib.signIn()
返回一个承诺

然后我想在
之前的
块中使用此命令:

  before(() => {
    cy.login();
    cy.saveLocalStorage();
  });
我注意到这个承诺没有得到解决。 “黑客”修复方法是在
login()
saveLocalStorage()之间添加
cy.wait(4000)
。 但是这使得我的测试依赖于auth服务器的加载时间

我发现了这个“相关”问题:在哪里引用。但此库不能在每个
之前的
或之前的
中使用

如何等待从
login()
/返回的承诺?在执行
cy.saveLocalStorage()
之前,请确保从
login()
返回的承诺已得到解决

更新

我添加了在以下情况下有效和无效的示例:

解决方案是从
cy开始。然后()


确保在
Cypress.Commands.add
callback中返回该承诺。 在Cypress上下文中处理承诺有点混乱,因为许多异步行为都是在cy.命令中神奇地处理的

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

其他解决方案:

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

before(() => {
  cy.login();
  cy.setLocalStorage("accessToken", data.accessToken);
});

确保在
Cypress.Commands.add
callback中返回该承诺。 在Cypress上下文中处理承诺有点混乱,因为许多异步行为都是在cy.命令中神奇地处理的

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

其他解决方案:

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

before(() => {
  cy.login();
  cy.setLocalStorage("accessToken", data.accessToken);
});

before
块中,我是否应该等待登录:
wait login()
?在
async之前调用make
并调用
wait cy.login()
或者只调用
cy.login()
使测试在
before
函数中保持挂起。嗯,有趣的
cy.login()
应该可以工作。在原始答案的基础上添加了其他解决方案。我感觉一个人无法从Cypress命令中返回承诺。除非它被包装在
cy.then()
中。这是我让它工作的唯一方法(见有问题的更新)。我尝试了你的建议,但Cypress仍然坚持承诺。在
before
块中,我是否应该等待登录:
wait login()
?在
async之前调用making
并调用
wait cy.login()
或只是调用
cy.login())
使测试在
函数之前一直挂起。Hmmmm,有趣的
cy.login()
应该可以工作。在原始答案的基础上添加了其他解决方案。我感觉一个人无法从Cypress命令中返回承诺。除非它被包装在
cy.then()
中。这是我让它工作的唯一方法(见有问题的更新)。我试过你的建议,但赛普拉斯仍然信守诺言。