赛普拉斯-如何在另一个请求标头中使用响应主体

时间:2019-02-06 19:52:46

标签: javascript cypress

我有一个将返回令牌的函数

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')
    });
});

2 个答案:

答案 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()