2016-04-04 8 views
1

ich den folgenden Code haben, die Elemente, die Text-Filter:Winkelmesser count() Erwartung nicht unerwartet

var myspan = searchChoices.filter(function(elem, index) { 
     return elem.getText().then(function(text) { 
      //console.log('index text:' +text); 
      return text === 'Consultant 110'; 
     }); 
    }); 

    expect(myspan).not.toBe(null); 
    myspan.count().then(function (x) { 
     console.log('count:'+x); 
    }); 

    expect(myspan.count()).toBe(1); // this succeeds 
    expect(myspan.count()===1).toBe(true); // <---This fails 

Das Merkwürdige ist, dass die Erwartung in Zeile vor der letzten Zeile gelingt, aber die letzte ausfällt. Was ist der Grund ?

+0

[ 'count()'] (https://angular.github.io/protractor/#/ api? view = ElementArrayFinder.prototype.count) gibt eine Verheißung und keine ganze Zahl zurück. 'expect()' weiß, wie man mit dem Versprechen umgeht, aber 'count() === 1 'wird immer fehlschlagen – Phil

+0

Ja, aber ist nicht erwartet, dass alle Versprechungen vor der Auswertung gelöst werden sollen? – chrisl08

+0

Ja, aber das ist ein Boolescher Wert, an den du gehst, kein Versprechen – Phil

Antwort

3

Denken Sie daran, dass alles, was Webtreiber in Winkelmesser betrifft, ein Versprechen zurückgibt - ein Objekt, das auf eine Control Flow gesetzt würde, die später in der Warteschlange der Versprechen aufgelöst würde. Der tatsächliche Wert ist nicht sofort verfügbar.

Nun hat expect() ein besonderes Verhalten - in Protractor (eigentlich in jasminewd2) ist es gepatcht Versprechen s zu verstehen - es würde ein Versprechen lösen, bevor die Erwartung zu machen. Deshalb funktioniert expect(myspan.count()).toBe(1) in Ihrem Fall. Und myspan.count()===1 wäre immer false - seit myspan.count() selbst ist ein Versprechen und es ist immer nicht gleich 1.

FYI, wenn Sie die === 1 Kontrolle haben wollen, können Sie manuell das Versprechen lösen:

myspan.count().then(function (actualCountValue) { 
    expect(actualCountValue === 1).toBe(true); 
});