javascript - Mislukte verwachting: "Verwacht [ ] een lege array te zijn."
Hier is de falende test:
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();
});
});
waar MyPage een Page Object is:
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;
waar errors verondersteld werden een array van zichtbare foutmeldingen te zijn die op een pagina worden gevonden.
Hier is de fout die we krijgen:
Failures:
1) Checking errors should not show any errors
Message:
Expected [ ] to be empty array.
Stacktrace:
Error: Failed expectation
Ter info, de toBeEmptyArray() matcher komt van de derde partij jasmine-matchers.
Ik heb geprobeerd om de waarde van scope.page.errors op deze manier af te drukken:
scope.page.errors.then(function (errors) {
console.log(errors);
});
En het wordt afgedrukt als []. Array.isArray(errors) retourneert true.
Volgens wat ik zie, is scope.page.errors een lege array, maar de verwachting faalt. Wat mis ik?
Antwoord #1
het antwoord staat vier regels lager in de waterpas broncode.
ElementArrayFinder extends Promise, terwijl jasmine-matchers eerst controleert of errors daadwerkelijk een array is, precies zoals Array.isArray doet, wat false zal teruggeven;
Dit is ook consistent met expect(scope.page.errors.length).toBe(0) die ongedefinieerd is omdat promises geen lengtes hebben.
Voer gewoon errors.then uit op je belofte, en test dat het argument [] is. Je hebt ook laten zien dat dit kan worden gedaan toen je scope.page.errors.then uitvoerde.
Antwoord #2
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();
});
});
