2016-07-15 22 views
3

Ich habe einen BDD-Beispieltest mit Winkelmesser mit Gurke. Beim Ausführen des Codes zeigt die Konsole sofort das Ergebnis als übergeben an und der Code beginnt erst danach mit der Ausführung.Winkelmesser-Gurke BDD-Tests Pass vor der Ausführung anzeigen

Ich wünsche, dass die Ausführungsstatusanzeige mit der tatsächlichen Ausführung übereinstimmt (zB Konsolenanzeigen - 'Gegeben, ich starte die Winkelmesserdemo Seite' und der darunter liegende Code wird ausgeführt, dann zeigt die Konsole den nächsten Schritt an) I weiß, dass es etwas mit Async-Codierung und Callbacks zu tun hat, aber nicht in der Lage ist, das genaue Problem herauszufinden.

Feature-Datei:

Feature: Test 
Scenario: Test Scenario 
    Given I launch the protractor demo page 
    When I enter two in the first field 
    And I enter three in the second field 
    And I click Go button 
    Then Result should be displayed as Five 

Schritt Datei:

var chai = require('chai'); 
    var chaiAsPromised = require('chai-as-promised'); 
    chai.use(chaiAsPromised); 
    var expect = chai.expect; 

    module.exports = function() { 


     this.Given(/^I launch the protractor demo page$/, function (callback) { 
      browser.driver.manage().window().maximize(); 
      browser.get('http://juliemr.github.io/protractor-demo/'); 

      browser.getTitle().then(function(text){ 
       console.log('title is - ' + text); 
       expect(text).to.equal('Super Calculator'); 
      }); 
     callback(); 
     }); 

     this.When(/^I enter two in the first field$/, function (callback) { 
      element(by.model('first')).sendKeys('2'); 
      callback(); 
     }); 

     this.When(/^I enter three in the second field$/, function (callback) { 
      element(by.model('second')).sendKeys('3'); 
      callback(); 
     }); 

     this.When(/^I click Go button$/, function (callback) { 
      element(by.id('gobutton')).click(); 
      callback(); 
     }); 

     this.Then(/^Result should be displayed as Five$/, function (callback) { 
      element(by.repeater('result in memory')).all(by.tagName('td')).get(2).getText().then(function(text){ 
      expect(text).to.equal('5'); 
      }); 
      callback(); 
     }); 

    }; 
+0

Winkelmesser Version ist 3.3.0 – Manya

Antwort

5

Sie benötigen return ein Versprechen an entweder oder verwenden Sie die done Rückruf in Ihren Schritt Definitionen. Ansonsten weiß Gurke nicht, wann Ihre asynchronen Aktionen abgeschlossen sind.

Ich hatte die gleiche Frage und oben Aussage war die Antwort von einem der Kernmitglieder des protractor-cucumber github Forums.

Ich bevorzuge es return Versprechen, wenn ich auf die Ergebnisse mit .then Funktion einige Aktionen am Durchführung und .done Callback-Funktion verwenden, wenn ich nicht bin, auch nicht Sie brauchen callbacks jetzt CucumberJS Versprechen unterstützt. So sollten Sie Ihre Schritt-Datei aussehen -

var chai = require('chai'); 
var chaiAsPromised = require('chai-as-promised'); 
chai.use(chaiAsPromised); 
var expect = chai.expect; 

module.exports = function() { 


    this.Given(/^I launch the protractor demo page$/, function() { 
     browser.driver.manage().window().maximize(); 
     browser.get('http://juliemr.github.io/protractor-demo/'); 

     return browser.getTitle().then(function(text){ 
      console.log('title is - ' + text); 
      expect(text).to.equal('Super Calculator'); 
     }); 
    }); 

    this.When(/^I enter two in the first field$/, function() { 
     return element(by.model('first')).sendKeys('2'); 
    }); 

    this.When(/^I enter three in the second field$/, function() { 
     return element(by.model('second')).sendKeys('3'); // you can use return also 
    }); 

    this.When(/^I click Go button$/, function() { 
     return element(by.id('gobutton')).click(); 
    }); 

    this.Then(/^Result should be displayed as Five$/, function() { 
     return element(by.repeater('result in memory')).all(by.tagName('td')).get(2).getText().then(function(text){ 
     expect(text).to.equal('5'); 
     }); 

    }); 

}; 

Ich würde Ihnen empfehlen über Promiseshttp://www.html5rocks.com/en/tutorials/es6/promises/ zu lesen, da sie ein gewisses Verständnis erfordert, wie behave.They sie manchmal schwierig sein kann, dauerte es eine Weile, um eine Vorstellung zu bekommen, noch ich habe viel zu lernen :)

+0

Versucht die Lösung von @ Igniteram1 gegeben. Die ersten beiden Schritte werden wie zuvor ausgeführt, dh sie zeigen den Durchlauf noch bevor die eigentliche Ausführung begonnen hat. Im dritten Schritt gehen die Skriptfehler mit der Nachricht 'Funktion nach 5000 ms abgelaufen' – Manya

+0

das ist seltsam, versuche dein Standard-Zeitlimit zu erhöhen und benutze return in den ersten beiden Schritten auch –

+0

Ich aktualisierte meine Antwort, sollten Sie nicht maximieren und erhalten Sie URL in Ihre Schritte, sollten diese ein Teil von 'onPrepare' oder' vorher' Haken –