温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - Cypress: Returning value in promise within custom command?
cypress promise

其他 - 赛普拉斯:在自定义命令中以诺言返回值吗?

发布于 2020-04-13 14:10:14

因此,我尝试使用自定义命令来减少在多个文件中写入相同内容的需要。具体来说,这是用于通过JWT登录和设置令牌。

这是当前的工作代码(从cypress示例的JWT登录示例中借用):

let user;
before(function() {
  cy.request("POST", Cypress.env("auth_url"), {
    username: Cypress.env("auth_username"),
    password: Cypress.env("auth_password")
  })
    .its("body")
    .then(res => {
      user = res;
    });
});
beforeEach(function() {
  console.log(cy.get_auth_token)
  cy.visit("/", {
    onBeforeLoad(win) {
      // set the user object in local storage
      win.localStorage.setItem("token", user.token);
    }
  });
});

所以我想通过做类似的事情:

Cypress.Commands.add("get_auth_token", () => {
    let user;
    cy.request("POST", Cypress.env("auth_url"), {
        username: Cypress.env("auth_username"),
        password: Cypress.env("auth_password")
      })
        .its("body")
        .then(res => {
          user = res;
        });
    return user;

})

但是,当我尝试在beforeEach函数中调用它时,let user = cy.get_auth_token出现关于用户未定义的错误。我在返回值时做错了什么吗?我不是诺言方面的专家...但是,感觉应该可行吗?

谢谢!

查看更多

提问者
msmith1114
被浏览
83
eric99 2020-02-03 11:23

命令与函数不同,返回值不可分配给局部变量。而是将其“屈服”到链中的下一个命令,可以是then()同样,该值是一个“主题”,它是返回值的jQuery包装版本。

简而言之,这应该是您使用自定义命令的方式:

beforeEach(function() {
  cy.get_auth_token().then($user => {
    console.log($user[0]);
    cy.visit("/", {
      onBeforeLoad(win) {
        // set the user object in local storage
        win.localStorage.setItem("token", $user[0].token);
      }
    });
  });
});