Utilisez des modules d'assistance pour les tâches répétées et commandées lorsque des tests fonctionnels en interne

J'essaie de créer un module qui remplira les entrées de formulaire lors des tests fonctionnels, et j'aimerais pouvoir l'appeler à partir de plusieurs ensembles test.

Pseudo code pour le fichier helper (helper.js)

module.exports = { fillForm: function() { this.findByCssSelector('#firstname') .click() .pressKeys('John') .end() }, anotherFunction: function() { // more code } } 

Dans la spécification pour le test fonctionnel, je charge ce module en tant helper et je peux le voir exécuter. Cependant, il semble que je ne puisse pas utiliser cette syntaxe et garantir que les étapes enchaînées s'exécutent dans l'ordre défini:

 'Test filling form data': function() { return this.remote .get(require(toUrl(url)) // should happen first .then(helper.fillForm) // should happen second .then(helper.anotherFunction) // only after the above should the click happen .findByCsSelector('#submit') // click evt should show the #someElement element .click() .findByCssSelector('#someElement') .getComputedStyle('display') .then(style) { // assertions here } 

Il semble que le chaînage de la promesse permet à l'événement de click se produire avant que les callbacks aient été exécutés. Est-ce que ce type de flux est possible avec un stagiaire?

METTRE À JOUR:

Pour le moment, travaillez autour de ceci avec ce type de code:

 var remote = initTest.call(this, url); return helpers.fillForm1Data.call(remote) .otherChainedMethodsHere() .moreChainedMethods() .then() { // assertion code here 

Où la méthode initTest effectue la récupération, le dimensionnement de la fenêtre, la suppression des données et le fillForm1Data fait comme vous vous attendez. Mais la syntaxe est assez moche de cette façon.

Votre assistant ne return aucune valeur, donc il est traité comme un rappel synchrone et la prochaine chose dans la chaîne est exécutée immédiatement. Vous ne pouvez pas non plus return this d'une aide prometteuse ou cela causera une impasse (parce que la promesse de commandement s'attendra à résoudre elle-même – Le stagiaire va lancer une erreur si vous essayez de le faire), vous devez donc créer une nouvelle commande Et renvoyez-le si vous souhaitez utiliser l'interface de commande enchaînée dans votre assistant:

 module.exports = { fillForm: function() { return new this.constructor(this.session) .findByCssSelector('#firstname') .click() .pressKeys('John'); }, anotherFunction: function() { // more code } }; 

Vous pouvez également revenir de this.session place si vous ne vous souciez pas de la commodité de l'API de commande et pouvez faire face à des chaînes de rappel de promesses normales:

 module.exports = { fillForm: function() { var session = this.session; return session.findByCssSelector('#firstname') .then(function (element) { return element.click(); }) .then(function () { return session.pressKeys('John'); }); }, anotherFunction: function() { // more code } };