2014-07-03 19 views
15

Nel mio test sto chiamando e all'esterno della libreria per seminare i dati nel nostro back-end prima di eseguire alcuni test dell'interfaccia utente usando il goniometro.Come si aggiunge una promessa alla coda di controllo del flusso usando il rapportatore?

'use strict' 

var dataBuilder = require('data_builder.js'); 

describe('test', function() { 
    var testData = { 
    name: 'foo', 
    title: 'bar', 
    ... 
    }; 

    beforeEach(function() { 
    //create test data on the backend 
    dataBuilder.create(testData).then(function (id) { 
     testData.id = id.id; 
    }); 
    }); 



    it('test something', function() { 
    ... 
    }); 

Come tale la promessa restituito dal dataBuilder non viene risolto prima della esso() finisce in realtà. Come posso aggiungere la promessa restituita da dataBuilder nel controllo di flusso di webDriver?

risposta

15

Il goniometro espone WebDriverJS promette sull'oggetto goniometro in modo da poter utilizzare il metodo flow.await o creare una nuova promessa e utilizzare flow.execute.

qualcosa

Il primo potrebbe essere raggiunto come:

flow = protractor.promise.controlFlow() 

flow.await(dataBuilder.create(testData)).then(function(id) { 
    testData.id = id.id; 
}) 

E si può vedere un esempio di questi ultimi in questo blog post.

Questo può essere fatto nella funzione it o se questo è comune a tutti i test, considerare di inserirlo nella funzione onPrepare della configurazione del goniometro.

+2

Ho usato questo approccio eccetto che ho usato la funzione 'browser.controlFlow(). Await (...)' che il goniometro ora supporta, funziona alla grande! –

12

Nei test sul goniometro, aggiungo qualcosa nel controllo di flusso di webDriver utilizzando il seguente schema. Se uno crea e restituisce una promessa da queste "varie dichiarazioni", la promessa verrà inserita correttamente nel flusso di controllo.

browser.controlFlow().execute(function() { 
    // various statements 
}); 
+1

Buona risposta, ma è necessario chiarire che si può creare e restituire una promessa da queste "varie dichiarazioni" che verranno inserite correttamente nel flusso di controllo – floribon

2

In questo caso specifico, è possibile utilizzare il done di richiamata nel beforeEach come questo:

beforeEach(function (done) { 
    dataBuilder 
     .create(testData) 
     .then(function (id) { 
     testData.id = id.id; 
     }) 
     .finally(done); 
}); 

Accettare un parametro done callback indica che l'installazione è asincrona.

0

ho mai a ricordare la sintassi, per cui uso un hack di sorta che è più facile da ricordare in quanto si basa sul modo in cui la promessa si comporta (in modo sostanzialmente è possibile utilizzare questo in ogni sistema basato promessa)

browser.sleep(1).then(()=> { 
    return someAsyncPromiseAction(); 
}) 

Un'altra cosa che potresti fare è semplicemente affidarti all'azione prima di essa. Quindi se, per esempio, appena fatto clic su un pulsante che sarà simile a questa

$(' ... ').click().then(() => { return someAsync(); }) 

Anche se questo non aggiunge una promessa per il controllo del flusso, è ancora ottenere lo stesso risultato.

Problemi correlati