Вложенное обещание возвращается неопределенным
Я пытаюсь написать тесты с cucumber.js, используя Protractor и chai-as-обещано.
В моем объекте Page у меня есть следующие фрагменты кода:
var menusOnListElements = element.all(by.repeater('menu in menus').column('menu.name'))
this.isMenuListed = function(menu) {
return menusOnListElements.each(function(element) {
return element.getText().then(function (name) {
if (menu.name === name) {
return true; //this is executed
}
});
});
};
и в моем коде определения шага я делаю:
var menu = {};
menu.name = 'Abc';
expect(new MenusPage().isMenuListed(menu)).to.eventually.be.true.notify(done);
Когда я запускаю этот тест, я получаю
ожидается неопределенное, чтобы быть правдой
Это означает, что метод isMenuListed вернул undefined вместо true. Тем не менее, я отладил его и вижу, что "верни истину"; заявление выполнено.
Я что-то упускаю из-за того, как обещания работают в этом случае?
1 ответ
Кроме того, вы также можете подать заявку reduce()
Вот:
this.isMenuListed = function(menu) {
return menusOnListElements.reduce(function(acc, element) {
return element.getText().then(function (name) {
return acc || menu.name === name;
}, false);
});
};
Недостатком здесь является то, что мы проходим каждый элемент в menusOnListElements
и не останавливайтесь, если мы найдем соответствующее меню. Помимо этого, reduce()
разрешил бы здесь в true
или же false
который определяет, находится ли меню в списке или нет.