Je veux utiliser le module Node Http pour appeler mon serveur directement afin de configurer mes tests Protractor. Http est basé sur le rappel et je veux transformer cela en promesses.
Par exemple, je veux que cette fonction renvoie la promesse:
function callMyApi() {
var promise = // somehow create promise;
http.request({path: '/yada/yada', method: 'POST'}, function(resp) {
promise.complete(resp);
});
return promise;
}
Donc, la question est: de quoi ai-je besoin pour require()
et mettre en place "en quelque sorte créer une promesse" pour que cela fonctionne?
Protractor utilise les promesses de WebDriver et expose cette API à l'échelle mondiale sur "rapporteur". Vous devriez donc pouvoir faire
var deferred = protractor.promise.defer();
return deferred.promise;
Pour l'API Promise WebDriverJS complète, consultez le code à l'adresse https://code.google.com/p/Selenium/source/browse/javascript/webdriver/promise.js
Ce n'est pas la bonne façon de procéder, mais connaître le flux de contrôle du rapporteur pourrait vous aider. Si vous souhaitez exécuter Javascript régulièrement dans l'ordre du rapporteur, ajoutez-le via le flux de contrôle.
Dans ce cas, vous pouvez utiliser votre propre bibliothèque de promesses si vous le souhaitez, puis utilisez simplement browser.wait
d'attendre la fin de vos promesses.
var Promise = require('bluebird');
var promises = [];
browser.controlFlow().execute(function() {
var p = new Promise...
promises.Push(p);
});
browser.wait( function(){ return Promise.all(promises); }, timeoutMs );
Je l'utilise non pas pour des promesses régulières, mais pour console.log
instructions ou faire le chronométrage pour une partie d'un test, ou même utiliser fs
pour imprimer quelque chose dans un test dans un fichier.
var startTime, duration;
browser.controlFlow().execute(function() {
startTime = new Date().getTime();
});
//Protractor code you want timed
browser.controlFlow().execute(function() {
duration = new Date().getTime() - startTime;
console.log("Duration:", duration);
});