2014-07-03 8 views
15

In meinem Test rufe ich und externe Bibliothek, um Daten in unser Backend zu säen, bevor Sie einige ui Tests mit Winkelmesser ausführen.Wie fügen Sie der Ablaufsteuerungswarteschlange mithilfe von Winkelmesser ein Versprechen hinzu?

'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() { 
    ... 
    }); 

Als solches wird die vom dataBuilder zurückgegebene Zusage nicht gelöst, bevor die it() tatsächlich beendet wird. Wie kann ich das Versprechen, das der dataBuilder in die Ablaufsteuerung von webDriver zurückgibt, hinzufügen?

Antwort

15

Winkelmesser macht WebDriverJS Versprechen auf dem Winkelmesser Objekt, so dass Sie entweder die flow.await Methode verwenden oder ein neues Versprechen erstellen und flow.execute verwenden können.

Erstere erreicht werden könnte, so etwas wie:

flow = protractor.promise.controlFlow() 

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

Und Sie ein Beispiel für die letztere in diesem blog post sehen können.

Dies könnte in der it Funktion selbst getan werden, oder wenn dies für alle Ihre Tests üblich ist, ziehen Sie es in die onPrepare Funktion Ihrer Winkelmesser Config.

+2

Ich benutzte diesen Ansatz, außer dass ich die 'browser.controlFlow(). Await (...)' Kurzschrift, die Winkelmesser jetzt unterstützt, funktioniert großartig! –

12

In meinen Winkelmesser-Tests füge ich etwas in die Flusskontrolle von webDriver ein, indem ich das folgende Muster verwende. Wenn man ein Versprechen aus diesen "verschiedenen Aussagen" erstellt und zurückgibt, wird das Versprechen korrekt in den Kontrollfluss eingefügt.

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

Akzeptieren ein done Rückrufparameter zeigt an, dass das Setup asynchron:

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

Gute Antwort, aber Sie sollten klarstellen, dass Sie ein Versprechen aus diesen "verschiedenen Anweisungen" erstellen und zurückgeben können, die korrekt in den Kontrollfluss eingefügt werden – floribon

2

In diesem speziellen Fall könnten Sie die done Rückruf in der beforeEach wie folgt verwenden.

0

Ich erinnere mich nie die Syntax, so dass ich ein hack der Art, die leichter zu merken ist, da es auf dem Weg beruht Versprechen verhält (also im Grunde Sie diese in jedem Versprechen basierten System verwenden können)

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

Eine andere Sache, die Sie tun können, ist verlassen Sie sich einfach auf die Aktion davor. Also, wenn Sie zum Beispiel nur einen Knopf angeklickt haben wie diese

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

aussehen Zwar ist dies nicht ein Versprechen an die Ablaufsteuerung hinzufügen, erhalten Sie noch das gleiche Ergebnis.