wake-up-neo.com

versprechen im Winkelmesser erstellen und lösen

Ich schreibe einen Testfall für das Hinzufügen von Speicherinformationen auf der Seite für die Angular-App mit Protractor, wobei ich zunächst die Anzahl der Speicher zähle, die ich bereits habe, und nachdem der Testblock abgeschlossen ist, erwarte ich, dass sich die Anzahl um 1 erhöht mache ich dies, indem ich diesem Link folgte, Versprechungen zu erstellen Wie kann man Versprechungen in Protraktor erstellen und manipulieren?

describe('myApp', function() {
  var items,startCount;

  var testPromise = function(){
    items = element.all(by.repeater('store in storelist'));
    var deferred = protractor.promise.defer();
    items.count().then(function(orgCount){
       startCount = orgCount;
       console.log('Start Count: '+ startCount); //prints correct value e.g, 6
    }, function(error){
       console.log(error);
    });
    return deferred.promise;
  };

it('should accept valid data for adding new store', function() {
   var cNum = null;
   testPromise().then(function(result){
      cNum = result;
      console.log('cNUm value: '+ cNum); //this value doesn't get printed in console
   });
   /* Code for adding test fields in store page */

   expect(items.count()).toBe(cNum+1);
 });
});

Ich gehe davon aus, dass die Anzahl der Shops am Ende des Tests gleich ist. count () löst ein Versprechen auf, und der korrekte Wert des Speichers count wird in testPromise () gedruckt, aber in diesem Block wird gesperrt, wenn ich testPromise () aufrufe. Dann geht die Methode nie in diesen "then" -Block

und das Endergebnis sagt 

Message:
 Expected 6 to be 1.
 Stacktrace:
  Error: Failed expectation

Ich habe auch in webdriver.promise.Promise () etwas über diesen Link http://Selenium.googlecode.com/git/docs/api/javascript/class_webdriver_promise_Promise.html recherchiert und versucht, ein Versprechen zu erstellen und seinen Wert zu lösen, aber nicht sicher, was das Problem ist. Entweder bekomme ich eine Fehlermeldung mit der Nachricht 'erwartete 6 wird NaN' oder 'erwartet 6' 1 'Löse ich ein Versprechen nicht oder schreibe' dann 'richtig blockieren? Würde mich über einige Erkenntnisse/Hilfe zu diesem Thema freuen.

22
DesaiM

Hier ist ein Arbeitsbeispiel einer benutzerdefinierten Funktion für die Verwendung in Protractor, die ein Versprechen erstellt und erfüllt (oder ablehnt):

// Get the text of an element and convert to an integer.
// Returns a promise.
function getTextAsInteger(element, radix) {
  // Specify a default radix for the call to parseInt.
  radix = radix || 10;
  // Create a promise to be fulfilled or rejected later.
  var deferred = protractor.promise.defer();
  // Get the text from the element. The call to getText
  // returns a promise.
  element.getText().then(
    function success(text) {
      var num = parseInt(text, radix);
      if (!isNaN(num)) {
        // Successfully converted text to integer.
        deferred.fulfill(num);
      } else {
        // Error converting text to integer.
        deferred.reject('could not parse "$1" into an integer'
          .replace('$1', text));
      }
    },
    function error(reason) {
      // Reject our promise and pass the reason from the getText rejection.
      deferred.reject(reason);
    });

  // Return the promise. This will be resolved or rejected
  // when the above call to getText is resolved.
  return deferred.promise;
}

Die Funktion nimmt element als Argument und ruft ihre getText()-Methode auf, die selbst ein Versprechen zurückgibt. Bei einem erfolgreichen Aufruf von getText() analysieren Sie den Text als Ganzzahl und erfüllen das Versprechen. Wenn getText() ablehnt, geben wir den Grund an unseren eigenen Ablehnungsaufruf weiter.

Um diese Funktion zu verwenden, übergeben Sie ein Elementversprechen:

var numField = element(by.id('num-field'));
getTextAsInteger(numField).then(
    function success(num) {
        console.log(num);
    }, 
    function error(reason) {
        console.error(reason);
    });

oder:

var numField = element(by.id('num-field'));
expect(getTextAsInteger(numField)).toEqual(jasmine.any(Number));
expect(getTextAsInteger(numField)).toBeGreaterThan(0);
11
t.888

Schaffung

Um ein Versprechen für einen Winkelmesser zu erstellen, müssen Sie schreiben:

var deferred = protractor.promise.defer();
var promise = deferred.promise;

Rückrufe

Die Callbacks werden asynchron aufgerufen. __ Sie können einen (oder mehrere) Callbacks "bei Erfolg" registrieren:

promise.then(function() {
   ...
});

sie können auch einen (oder mehrere) Rückruf "bei Fehler" registrieren:

promise.then(null, function() {
   ...
});

Diese Registrierungen können verkettet werden:

promise.then(function() {
   ...
}).then(function() {
   ...
}).then(null, function() {
   ...
}).then(function() {

}, function() {
   ...
}).then(onSuccess, onFailure);

Auflösung

Erfolg

Die Rückrufe "bei Erfolg" werden aufgerufen, wenn das Versprechen erfolgreich gelöst wurde:

deferred.fulfill(value);

Failure

Die Rückrufe "bei Versagen" werden aufgerufen, wenn das Versprechen erfolgreich gelöst wurde:

deferred.reject(new Error('a problem occurs'));

In deinem Code

sie haben den Auflösungsschritt verpasst. Sie müssen das Versprechen erfüllen.

Eine ausführlichere Referenz finden Sie in der Webdriver.js-Dokumentation.

47
gontard

Ich habe das gleiche Problem und habe es gelöst, indem ich ein Versprechen für die erwartete Anzahl der Artikel erstellt habe:

it('should accept valid data for adding new store', function() {
    // Given
    let expectedCountAfterNewRow = items.count().then((cnt)=>{return cnt+1}); 
    // Note: items.count() is a promise so the expected count should a promise too

    // When
    /* Code for adding test fields in store page */

    // Then
   expect(items.count()).toEqual(expectedCountAfterNewRow);
});
0
Julien Kronegg