Вложенное обещание возвращается неопределенным

Я пытаюсь написать тесты с 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 который определяет, находится ли меню в списке или нет.

Другие вопросы по тегам