История:
Мы разработали индивидуальный набор жасмина, который выполняет две основные функции:
- мышь над определенным элементом
- проверьте, есть ли всплывающая подсказка с нужным текстом
Реализация:
toHaveTooltip: function() {
return {
compare: function(elm, expectedTooltip) {
var tooltipPage = requirePO("tooltip");
browser.actions().mouseMove(elm).perform();
browser.wait(EC.visibilityOf(tooltipPage.tooltip), 5000, "Tooltip is still not visible.");
return {
pass: tooltipPage.tooltip.getText().then(function(actualTooltip) {
return jasmine.matchersUtil.equals(actualTooltip, expectedTooltip);
}),
message: "Element does not have the tooltip '" + expectedTooltip + "'."
};
}
};
},
где tooltipPage
- объект страницы, определенный отдельно:
var Tooltip = function () {
this.tooltip = element(by.css(".tooltip"));
};
module.exports = new Tooltip();
Использование довольно удобно для нас и действительно помогает следовать принципу DRY, сохраняя нашу тестовую базу кода чистой и удобочитаемой:
expect(page.fromDateInput).toHaveTooltip("After");
Проблема и вопрос:
Теперь то, что я пытаюсь сделать, состоит в том, чтобы иметь дескриптор сопряжения 2 варианта использования отдельно:
- нет курсора мыши над отображаемым вообще (что, в принципе, отклонено
browser.wait()
) - есть всплывающая подсказка, но не желаемая
Как я могу улучшить совпадение, чтобы иметь возможность обрабатывать эти две проблемы отдельно и сообщать о разных ошибках?
Что я пробовал:
toHaveTooltip: function() {
return {
compare: function(elm, expectedTooltip) {
var tooltipPage = requirePO("tooltip");
browser.actions().mouseMove(elm).perform();
return browser.wait(EC.visibilityOf(tooltipPage.tooltip), 5000, "Tooltip is still not visible.").then(function () {
return {
pass: tooltipPage.tooltip.getText().then(function(actualTooltip) {
return jasmine.matchersUtil.equals(actualTooltip, expectedTooltip);
}),
message: "Element does not have the tooltip '" + expectedTooltip + "'."
};
}, function () {
return {
pass: false,
message: "No tooltip shown on mouse over the element"
}
});
}
};
},
Здесь я попытался разрешить browser.wait()
явно и обрабатывать случаи "успеха" и "ошибки" отдельно. Это привело к тайм-ауту Jasmine Spec и огромному "красному" тексту на консоли:
Expected ({ ptor_: ({ setFileDetector: Function, ...
5 minutes scrolling here
... InnerHtml: Function, getId: Function, getRawId: Function }) to have tooltip 'After'.
Боюсь, я не могу вернуть обещание от функции "сравнить".