2016-05-19 27 views
0

Ich schreibe einen Test mit Protrator/Jasmine, der über ein paar hundert Datensätze iterieren soll. Der Test muss auf mehrere Links klicken und es gibt ein paar browser.sleep Methoden, die überall verstreut sind. Insgesamt dauert es ungefähr 10 Sekunden für eine Iteration des Tests.Wie kann ich Node auf den Abschluss einer Funktion warten lassen?

Wenn der Tests Einrichtung hatte ich ein einfaches Array in einer Schleife über:

verifyRecord = (record) -> 
    ... 
    element(`by`.id('generalSearch').sendKeys(record) 
    element(`by`.id('submit').click() 
    browser.sleep 3000 
    ... 
    expect(result).toBe(true) 

records = [ 
    'RCD-001' 
    'RCD-002' 
    'RCD-003' 
] 

describe 'The crucial records', -> 

    beforeEach -> 
     browser.ignoreSynchronization = true 

    it 'should be accessible to the user', -> 
     browser.get '/path/to/form' 
     for record in records 
      verifyRecord(record) 

Das funktioniert ganz gut. Jeder verifyRecord Aufruf tritt synchron auf und wird abgeschlossen, bevor der nächste ausgelöst wird. Aber die Liste der Datensätze ist lang und ändert sich, daher muss ich sie aus einer Textdatei ziehen, anstatt sie in meinem Skript zu codieren.

Wenn ich versuche, readline zu verwenden, um Datensatz-IDs aus einer Datei zu ziehen und über sie zu iterieren, werden alle sofort an die veryifyRecord-Funktion gesendet.

fs = require 'fs' 
readline = require 'readline' 

verifyRecord = ... 

describe 'The crucial records', -> 

    beforeEach -> 
     browser.ignoreSynchronization = true 

    it 'should be accessible to the user', -> 
     browser.get '/path/to/form' 

     lineReader = readline.createInterface({ 
      input: fs.createReadStream 'records.txt' 
     }) 

     lineReader.on 'line', (line) -> 
      verifyRecord(line) 

Ich denke, dass Readline- Ergebnisse in verifyRecord mit asynchron aufgerufen werden. Wenn ich innerhalb der verifyRecord Methode eine console.log(record) Methode hinzufüge, werden alle Datensatz-IDs fast sofort auf dem Terminal ausgegeben.

ich auch habe versucht, die Ergebnisse nach oben in ein lokales Array geladen und Iterieren, dass dann über:

Dies funktioniert auch nicht.

Wie kann ich die lineReader warten, bis jeder Aufruf verifyRecord vor dem Aufruf der Methode mit dem nächsten Datensatz in der Liste abgeschlossen?

+0

Mögliche Duplikat [So warten Funktion vor continuning in Node.js zu beenden] (http://stackoverflow.com/questions/28849900/how-to-wait-für-Funktion-bis-vor-continuning-in-node-js) – fuzz

Antwort

0

Haben Sie sich mit Mocha dafür angeschaut?

Alternativ können Sie anstelle des Rückrufs done() eine Zusage zurückgeben. Dies ist nützlich, wenn die APIs Sie Rückkehr Prüfung anstelle der Einnahme Rückrufe verspricht:

beforeEach(function() { 
    return db.clear() 
    .then(function() { 
     return db.save([tobi, loki, jane]); 
    }); 
}); 

describe('#find()', function() { 
    it('respond with matching records', function() { 
    return db.find({ type: 'User' }).should.eventually.have.length(3); 
    }); 
});