2015-03-18 4 views
6

Hier ist der fehlerhafte Test:Fehlgeschlagene Erwartung: "Erwartet [], um ein leeres Array zu sein."

describe("Checking errors", function() { 
    var scope = {}; 

    beforeEach(function() { 
     browser.get("/#endpoint"); 
     browser.waitForAngular(); 

     scope.page = new MyPage(); 
    }); 

    it("should not show any errors", function() { 
     expect(scope.page.errors).toBeEmptyArray(); 
    }); 
}); 

wo MyPage ist ein Seite Objekt:

var MyPage = function() { 
    this.errors = element.all(by.css("div.error-block b.error")) 
     .filter(function (elm) { 
      return elm.isDisplayed().then(function (value) { 
       return value; 
      }); 
     }) 
     .map(function (elm) { 
      return elm.getText(); 
     }); 
}; 

module.exports = MyPage; 

wo errors sollten eine Reihe von sichtbaren Fehlertexten auf einer Seite zu finden sein. Hier

ist der Fehler, den wir bekommen:

Failures: 

    1) Checking errors should not show any errors 
    Message: 
    Expected [ ] to be empty array. 
    Stacktrace: 
    Error: Failed expectation 

FYI, toBeEmptyArray() Matcher kommt von jasmine-matchers Dritter.


Ich habe versucht, auf diese Weise den Wert von scope.page.errors auszudrucken:

scope.page.errors.then(function (errors) { 
    console.log(errors); 
}); 

Und es wird als [] ausgedruckt. Array.isArray(errors) gibt true zurück.

Von was ich sehe, scope.page.errors ist ein leeres Array, aber die Erwartung schlägt fehl. Was ich vermisse?

+0

Was bekommen Sie, wenn Sie Array.isArray log (Fehler)? – Ryan

+0

@Ryan hat das nicht erwartet, aber es druckt 'wahr'..weird. Vielen Dank. – alecxe

+0

Funktioniert 'expect (scope.page.errors.length) .toBe (0);'? Möglicherweise tritt ein Problem mit den Scopes auf, die vom Webdriver erstellt werden (wie Iframes auf einer Seite), die ihre eigene "Array" -Definition haben. Siehe http://StackOverflow.com/a/2265999/960524 (das könnte also ein Fehler in der 'toBeEmptyArray()' Methode sein - es ist wahrscheinlich fehlgeschlagen der "Array" -Ness Teil der Prüfung.) –

Antwort

3

die Antwort ist vier Zeilen nach unten in der protractor src.

ElementArrayFinder extends Promise, während Jasmin-Matcher überprüft first checks, dass Fehler ist ein tatsächliches Array genau wie Array.isArray is done, die falsch zurückgibt;

Dies stimmt auch damit überein, dass expect(scope.page.errors.length).toBe(0) nicht definiert ist, weil Versprechen keine Längen haben.

Gerade errors.then auf Ihrem Versprechen laufen und Test, dass das Argument [] ist Sie haben auch, dass kann getan sichtbar, wenn Sie scope.page.errors.then lief

+0

Danke, das habe ich vermutet (siehe Kommentare). Das Auflösen von 'scope.page.errors' mit' then() 'half jedoch nicht:' Erwartete [] als leeres Array.' wenn der folgende Code verwendet wurde: 'scope.page.errors.then (function (errors) {expect (Fehler) .toBeEmptyArray();}); '. – alecxe

+0

Mit anderen Worten, selbst der aufgelöste Wert ist kein Array, es sieht wie ein Array aus, ist es aber nicht (vergiss das "Duck" -Prinzip :)). Aber, jetzt habe ich einen Workaround - ich mache ein Array aus "fast ein Array": 'expect ([]. Concat (Fehler)). ToBeEmptyArray();'. Jedenfalls wert +1. – alecxe

+0

Leider folgt ihre Implementierung nicht dem 'Ente'-Prinzip, indem sie den toString des Objekts testet –

0
Inside test script your code line "scope.page = new MyPage();" is creating new empty MyPage object.Code which you have written in application script is creating page object locally and its not bounded with any angular scope.When there is requirement of testing such objects you need to replicate code for page object creation in beforeEach(); block of test script.And test it. 
describe("Checking errors", function() { 
    var scope = {}; 
    var MyPage ; 
    beforeEach(function() { 
     browser.get("/#endpoint"); 
     browser.waitForAngular(); 

     MyPage = function() { 
    this.errors = element.all(by.css("div.error-block b.error")) 
     .filter(function (elm) { 
      return elm.isDisplayed().then(function (value) { 
       return value; 
      }); 
     }) 
     .map(function (elm) { 
      return elm.getText(); 
     }); 
}; 
    }); 

    it("should not show any errors", function() { 
     expect(MyPage.errors).toBeEmptyArray(); 
    }); 
}); 
+0

Vielen Dank für die Teilnahme, obwohl es die Frage nicht beantwortet. – alecxe