2015-03-18 13 views
6

Oto test braku:Nieudane oczekiwanie: "Oczekiwano [], aby była pustą tablicą".

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(); 
    }); 
}); 

gdzie MyPage jest sprawdzonym Strona obiektu:

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; 

gdzie errors ma być tablicą tekstów widocznych błędów znajdujących się na stronie.

Oto błąd kupujemy:

Failures: 

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

FYI, toBeEmptyArray() dopasowujący pochodzi jasmine-matchers trzecie.


Próbowałem wydrukować wartości od scope.page.errors ten sposób:

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

I to jest drukowany jako []. Array.isArray(errors) zwraca true.

Z tego co widzę, scope.page.errors jest pustą tablicą, ale oczekiwanie nie powiedzie się. Czego mi brakuje?

+0

Co otrzymasz, jeśli log Array.isArray (błędy)? – Ryan

+0

@Ryan nie spodziewał się tego, ale wypisuje 'true'..weird. Dzięki. – alecxe

+0

Czy 'oczekiwać (scope.page.errors.length) .toBe (0);' działa? Być może napotkasz problem z zakresów tworzonych przez webdriver (takich jak ramki na stronie), które mają własną definicję "tablicy". Zobacz http://stackoverflow.com/a/2265999/960524 (więc może to być błąd w metodzie 'toBeEmptyArray()' - prawdopodobnie kończy się niepowodzeniem w części sprawdzającej "array").) –

Odpowiedz

3

Odpowiedź jest cztery linie w dół w protractor src.

ElementArrayFinder extends Promise, natomiast kontrole jaśmin-dopasowujących first checks że błędy są rzeczywiste tablicę dokładnie jak Array.isArray is done, który będzie return false;

Jest to również zgodne z expect(scope.page.errors.length).toBe(0) jest niezdefiniowane, ponieważ obietnice nie mają długości.

Wystarczy uruchomić errors.then na swojej obietnicy i testy że argument jest [] Pokazaliśmy też, co można zrobić, gdy prowadził scope.page.errors.then

+0

Dziękuję, to jest to, co podejrzewałem (patrz komentarze). Jednak rozwiązanie 'scope.page.errors' z' then() 'nie pomogło:' Oczekiwano [], aby była pustą tablicą. ", Gdy użyje się następującego kodu:' scope.page.errors.then (function (errors) {oczekiwać (błędy) .toBeEmptyArray();}); '. – alecxe

+0

Innymi słowy, nawet rozwiązana wartość nie jest tablicą, wygląda jak tablica, ale tak nie jest (zapomnij o zasadzie "kaczki" :)). Ale teraz mam obejście - robię tablicy z "prawie tablicy": 'oczekiwać ([]. Concat (błędy)). ToBeEmptyArray();'. I tak warto dać +1. – alecxe

+0

Niestety, ich implementacja nie jest zgodna z zasadą "kaczki", testując toString obiektu. –

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

Dziękuję za udział, chociaż nie odpowiada na pytanie. – alecxe

Powiązane problemy