因此,我尝试使用自定义命令来减少在多个文件中写入相同内容的需要。具体来说,这是用于通过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
出现关于用户未定义的错误。我在返回值时做错了什么吗?我不是诺言方面的专家...但是,感觉应该可行吗?
谢谢!
命令与函数不同,返回值不可分配给局部变量。而是将其“屈服”到链中的下一个命令,可以是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);
}
});
});
});
我还会坚持使用原来的命令功能吗?我需要为此进行调整吗?
我认为,在您的自定义命令中,您将需要将该
return user
行向上移动到.then(res => {...})
零件中,因为从POST获得响应将比自定义命令慢很多,因此将在返回值之前返回用户。我将模拟一些内容并添加到上面的代码段中。不过已经有了很好的例子,自定义命令在这里和使用这里。
还要注意,Gleb使用本地身份验证服务器进行测试,并且Auth0警告说,对Auth0 API执行测试可能会导致您的帐户速率受到限制,因此也值得复制。