3 votes

Cypress - Comment utiliser le corps de la réponse dans un autre en-tête de requête ?

J'ai une fonction qui renvoie un jeton

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

J'appelle cette fonction dans une autre commande Cypress, car j'ai besoin d'utiliser le jeton dans l'en-tête d'autorisation.

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

Lorsque j'exécute la commande, je ne vois pas le jeton utilisé. Au lieu de cela, je vois "authorization": "Bearer [object Object]" dans la demande.

Dans la fonction TestToken, j'ai ajouté cy.log(authToken); pour vérifier qu'il a bien saisi le jeton. Le test cypress a échoué en disant

CypressError : cy.then() a échoué parce que vous mélangez le code asynchrone et le code synchrone. sync.

mais je pouvais toujours voir le bon jeton dans la console.

Voici le test cypress que j'essaie d'exécuter

describe('Token Test', function() {
    before(() => {
        cy.ResetPwd();
    })
    it('Go to website', function() {
        cy.visit('https://site/login')
    });
});

1voto

functions est synchrone, de sorte qu'au moment de l'appeler, le résultat sera égal. Promise La promesse est un objet et lorsque l'on essaie d'exprimer l'objet (à l'aide de l'opérateur +), on obtient [object Object] .

Au bout d'un certain temps, la promesse sera résolue et la valeur en authToken sera correcte.

Pour y remédier, il est suggéré d'utiliser Cypress.Promise comme dans l'exemple de la documentation cypress : https://docs.cypress.io/api/utilities/promise.html#Basic-Promise

0voto

Dhananjai Pai Points 5146

Je suppose que le TestToken() est une promesse et se résout de manière asynchrone, ce qui fait que l'authToken est [ object Object ]

Vous pouvez utiliser async/await et le code devrait fonctionner correctement.

Ajouter async avant la fonction flèche et utiliser await const authToken = TestToken()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X