15 votes

Utiliser des pseudonymes à Cypress

J'essaie de partager des valeurs entre mes before y beforeEach des crochets utilisant des alias. Cela fonctionne actuellement si ma valeur est une chaîne de caractères mais lorsque la valeur est un objet, l'alias n'est défini que dans le premier test, tous les tests suivants this.user est indéfini dans mon hook beforeEach. Comment puis-je partager une valeur qui est un objet entre les tests ?

Voici mon code :

before(function() {
  const email = `test+${uuidv4()}@example.com`;
  cy
    .register(email)
    .its("body.data.user")
    .as("user");
});

beforeEach(function() {
  console.log("this.user", this.user); // This is undefined in every test except the first
});

0 votes

Cela ne semble pas correct (ni la réponse de @RichardMatsen). Pouvez-vous poster un exemple où exactement le this.user est indéfini dans les tests suivants ?

8voto

Richard Matsen Points 7624

Les variables aliasées sont accessibles via cy.get('@user') o expect(user) la syntaxe. Je comprends que cela est dû au fait que certaines commandes sont intrinsèquement asynchrones, et que l'utilisation d'un wrapper pour accéder à la variable garantit qu'elle est résolue avant d'être utilisée.

Voir la documentation Variables et alias y obtenir .

Si vous voulez accéder à une user vous pouvez essayer quelque chose comme

let user;

before(function() {
  const email = `test+${uuidv4()}@example.com`;
  cy
    .register(email)
    .its("body.data.user")
    .then(result => user = result);
});

beforeEach(function() {
  console.log("global user", user); 
});

où le then se résout comme une promesse, mais vous devez vous méfier du retard dans la résolution - la console.log peut s'exécuter avant le then .

2 votes

Merci ! J'ai choisi le cy.get('@user') en fin de compte. Cependant, le documentation implique que le this.user La syntaxe devrait fonctionner de la manière dont j'ai essayé.

0 votes

Vous avez tout à fait raison, je me souviens avoir vu cette page de documentation. Peut-être y a-t-il un retard causé par le .register() commande (s'agit-il d'une commande personnalisée ?)

0 votes

Oui .register() est une commande personnalisée, elle appelle cy.request() . Je trouve juste étrange que l'alias ne soit toujours disponible que dans le beforeEach du premier test, tous les tests après le premier sont indéfinis. Il semble que Cypress efface les alias entre les tests.

1voto

Janning Points 2079

Remplacer

console.log("global user", this.user); 

avec

cy.log(this.user);

et cela devrait fonctionner comme prévu.

La raison en est la nature asynchrone des commandes cypress. Voyez cela comme un processus en deux étapes : Toutes les commandes cypress ne font pas ce que vous pensez, quand elles sont exécutées. Elles construisent simplement une chaîne de commandes. Cette chaîne est exécutée comme le test plus tard.

Ce n'est évidemment pas le cas pour d'autres commandes telles que console.log() . Cette commande est exécutée lors de la préparation du test.

C'est expliqué en détail dans la documentation sur le cyprès :

Mais j'ai eu beaucoup de mal à m'y retrouver. Il faut s'y habituer. Une règle de base : Presque toutes les commandes de votre test doivent être des commandes Cypress.

Il suffit donc d'utiliser cy.log au lieu de console.log

Si vous devez utiliser console.log, vous pouvez le faire comme suit :

cy.visit("/).then(() => console.log(this.user))

de cette façon, le console.log est enchaîné. Ou si vous n'avez pas de sujet à enchaîner, construisez votre propre commande personnalisée comme ceci :

Cypress.Commands.add("console", (message) => console.log(message))
cy.console(this.user)

Une autre erreur dans l'utilisation de this à Cypress utilise des fonctions de flèche. Si c'est le cas, vous n'avez pas accès à la fonction this que vous attendez. Voir En évitant l'utilisation de ce dans la documentation sur le cyprès.

0voto

dr00 Points 53

TL;DR : Si vous voulez un alias de user disponible dans chacun de vos tests, vous devez le définir dans un objet beforeEach crochet pas un before crochet.

Cypress effectue un grand nombre de nettoyages entre les tests et cela inclut l'effacement de tous les alias. Selon la section Sharing Contexts de Variables et alias : "Les alias et les propriétés sont automatiquement nettoyés après chaque test." Le résultat que vous voyez (votre alias est nettoyé après le premier test et ensuite indéfini) est donc un comportement attendu.

Je ne peux pas déterminer ce que register dans l'article original, mais il semble que votre intention soit d'économiser les frais généraux liés à l'exécution répétée des appels d'API dans un fichier de type beforeEach crochet. Le plus simple est sans aucun doute de mettre tout ce que vous voulez dans les beforeEach et ignorez les frais généraux (de même, les appels d'API purs sans interaction avec l'interface utilisateur ne seront pas trop pénalisés).

Si vous avez vraiment besoin d'éviter la répétition, cela ne devrait pas être accompli par des variables régulières en raison des problèmes potentiels de synchronisation avec les chaînables personnalisés de Cypress. Il s'agit d'une anti-modèle qu'ils publient . La meilleure façon de procéder serait :

  • Créer un fichier de montage avec les données statiques de l'utilisateur que vous utiliserez pour effectuer le test. (Enlevez le uuidv4.)
  • Pour l'ensemble des tests qui ont besoin de vos données utilisateur, appelez register en un before crochet en utilisant les données de fixation. Cela créera les données dans le système testé.
  • Utilisez un beforeEach pour charger les données de fixation et les alias pour chacun de vos tests. Désormais, les données statiques dont vous avez besoin sont accessibles sans appel à l'API et leur présence dans le système est garantie grâce à la fonction before crochet.
  • Exécutez vos tests en utilisant l'alias.
  • Nettoyer les données dans un after hook (puisque votre utilisateur n'a plus d'email aléatoire, vous devez ajouter cette étape).

Si vous avez besoin de faire ce qui précède pour l'ensemble de la suite de test, mettez votre before y after les crochets dans le fichier de soutien pour les rendre globales.

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