tutorial - ¿Cuándo debemos usar.then con Promractor Promise?
protractor typescript (1)
La respuesta a esta pregunta se puede encontrar en esta publicación: http://spin.atomicobject.com/2014/12/17/asynchronous-testing-protractor-angular/
Es decir :
- El transportador pone en cola todos los comandos del controlador en ControlFlow,
- cuando necesite el resultado de un comando de controlador, debe usar .then,
- cuando no necesita el resultado de un controlador, puede evitar .entonces, pero todas las instrucciones siguientes deben colocarse en el ControlFlow; de lo contrario, se ejecutarán antes que los comandos en la cola que conduzcan a un resultado impredecible. Por lo tanto, si desea ejecutar un comando de pruebas que no sean controladores, debe agregarlo a la devolución de llamada .then o envolver la prueba en una Promesa y colocar la prueba en ControlFlow. Ver ejemplo a continuación.
Aquí hay un ejemplo de mi prueba trabajando sin .then:
log.debug(''test0'');
// enqueue the click
submitButton.click();
var message = $(''.alert-success'');
// enqueue the wait for message to be visible
browser.wait(EC.visibilityOf(message), 5000);
log.debug(''test1'');
// enqueue a test
expect(message.isPresent()).to.be.eventually.true;
log.debug(''test2'');
// a function returning a promise that does an async test (check in MongoDB Collection)
var testAccount = function () {
var deferred = protractor.promise.defer();
// Verify that an account has been created
accountColl.find({}).toArray(function (err, accs) {
log.debug(''test5'');
expect(err).to.not.exist;
log.debug(''test6'');
expect(accs.length).to.equal(1);
return deferred.fulfill();
});
return deferred.promise;
};
log.debug(''test3'');
// Enqueue the testAccount function
browser.controlFlow().execute(testAccount);
log.debug(''test4'');
La salida es ahora lo que esperamos:
test0
test1
test2
test3
test4
test5
test6
Tengo mucha inestabilidad con Protractor, y estoy seguro de que hay algo que no entiendo. A veces necesito usar .then () al hacer clic en un botón antes de continuar, a veces no tiene ningún impacto y no debo usar .then () o la prueba falló.
Me pregunto cuándo debería usar la devolución de llamada .then () al probar en el transportador. Ejemplo:
createAccountForm = $(''#form-create-account'');
submitButton = createAccountForm.$(''button[type=submit]'');
browser.wait(EC.elementToBeClickable(submitButton), 5000);
submitButton.click(); // .then(function(){ <-- uncomment in the .then form
// find the confirmation message
var message = $(''.alert-success'');
browser.wait(EC.visibilityOf(message), 5000);
log.debug(''After visibilityOf'');
expect(message.isPresent()).to.be.eventually.true;
// }); --> uncomment when in .then form
Cuando uso esta forma de prueba (sin .then ()) veo en el navegador que no se hace clic en el botón , la prueba continúa con lo siguiente y luego se detiene.
Si utilizo el formulario .then (), se hace clic en el botón y la prueba continúa sin errores.
En otra prueba, no necesito usar la devolución de llamada then () al hacer clic en el botón.
Entonces, ¿cuándo debo usar .then () y cuándo no?
Jean-Marc