Cuando debemos usar.¿entonces con la Promesa del Transportador?


Tengo mucha inestabilidad con el Transportador, y estoy seguro de que hay algo que no entiendo. A veces necesito usar el.entonces () al hacer clic en un botón antes de continuar, a veces no tiene ningún impacto y no debo usar .entonces () o la prueba falló.

Me pregunto cuándo debo usar el .then () callback al probar en Protractor ? 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 .entonces ()) Veo en el navegador que el clic en el botón no se hace, la prueba continúa con lo siguiente esperar y luego parar.

Si utilizo el .entonces () formulario, el clic en el botón se hace, y la prueba continuar sin error.

En otra prueba, no necesito usar la devolución de llamada then() al hacer clic en el botón.

Entonces, ¿cuándo debo usar el .entonces() y cuando no ?

Jean-Marc

Author: jmcollin92, 2015-03-29

1 answers

La respuesta a esta pregunta se puede encontrar en este post: http://spin.atomicobject.com/2014/12/17/asynchronous-testing-protractor-angular /

Es decir:

  1. Protractor enqueue todos los comandos del controlador en el ControlFlow,
  2. cuando necesite el resultado de un comando de controlador, debe usar .entonces,
  3. cuando no necesitas el resultado de un conductor puedes evitarlo .entonces, pero todos las siguientes instrucciones deben ser encoladas en el ControlFlow de lo contrario se ejecutará antes comandos en la cola que conducen a impredecible resultado. Por lo tanto, si desea ejecutar un comando no pruebas de controlador, debe agregarlo en el .a continuación, callback o envolver la prueba en una Promesa y poner en cola la prueba en el ControlFlow. Vea el ejemplo a continuación.

Aquí hay un ejemplo de mi prueba trabajando sin.entonces :

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
 39
Author: jmcollin92,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-18 06:59:16