Cypress - Как использовать тело ответа в другом заголовке запроса - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть функция, которая будет возвращать токен

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.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 голосов
/ 07 февраля 2019

Я предполагаю, что функция TestToken() является обещанием и разрешается асинхронно, в результате чего authToken становится [объектным объектом]

Вы можете использовать async/await, и код должен работать нормально.

Добавьте async перед функцией стрелки и используйте await const authToken = TestToken()

0 голосов
/ 07 февраля 2019

functions является синхронным, поэтому в момент вызова его результат будет равен Promise, обещание является объектом, и когда вы пытаетесь структурировать объект (с помощью оператора +), вы получаете [object Object].

Через некоторое время обещание будет разрешено, и значение в переменной authToken будет правильным.

Для исправления рекомендуется использовать Cypress.Promise, как в примере id cypress docs: https://docs.cypress.io/api/utilities/promise.html#Basic-Promise

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...