我有一个将返回令牌的函数
var accessToken;
function TestToken(){
return cy.request({
method: 'POST',
url: "https://site/token",
headers: {
'Content-Type': 'application/json',
},
body: {
client_id: '1234',
client_secret: '1234',
audience: 'https://site/api/v1/',
grant_type: 'credentials'
}
}).then(response => {
return new Cypress.Promise((resolve, reject) => {
const rbody = (response.body);
var tokenPattern = "(?i)\"access_token\":\\s*\"([^\"]*)\"";
const authToken = rbody.access_token;
accessToken = authToken
cy.log(accessToken);
resolve(accessToken);
return accessToken;
})
});
我需要在另一个cypress命令中调用该函数,因为我需要使用授权标头中的令牌
Cypress.Commands.add("ResetPwd", () => {
const authToken = TestToken();
cy.log(authToken);
cy.request({
method: 'POST',
url: "https://site/api/v2/users/1234",
headers: {
'Content-Type': 'application/json',
'authorization': 'Bearer '+authToken,
},
body: {
password: 'Test4321',
connection: 'DB',
}
});
});
当我执行命令时,看不到正在使用的令牌。相反,我在请求中看到了"authorization": "Bearer [object Object]"
。
在TestToken函数中,我添加了cy.log(authToken);
,以验证它正确地捕获了令牌。柏树测试失败说
CypressError:cy.then()失败,因为您混淆了异步和 同步代码。
但是我仍然可以在控制台中看到正确的令牌。
这是我要运行的柏树测试
describe('Token Test', function() {
before(() => {
cy.ResetPwd();
})
it('Go to website', function() {
cy.visit('https://site/login')
});
});
答案 0 :(得分:0)
functions
是同步的,因此在调用时,结果将等于Promise
,promise是object,当您尝试对对象进行字符串化(通过+运算符)时,您将得到[object Object]
。
一段时间后,承诺将被解决,并且authToken
变量中的值将正确。
要解决此问题,建议使用Cypress.Promise
,例如示例cypress文档示例:https://docs.cypress.io/api/utilities/promise.html#Basic-Promise
答案 1 :(得分:0)
我假设TestToken()
函数是一个Promise,并且异步解析导致authToken为[object Object]
您可以使用async/await
,代码应该可以正常工作。
在箭头功能之前添加async
,然后使用await const authToken = TestToken()