tutorial promise protractor

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 :

  1. El transportador pone en cola todos los comandos del controlador en ControlFlow,
  2. cuando necesite el resultado de un comando de controlador, debe usar .then,
  3. 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