Упрощение нескольких булевых проверок в один
В одном из наших тестов мы имеем следующий набор ожиданий:
expect(headerPage.dashboard.isDisplayed()).toBe(true);
expect(headerPage.queue.isDisplayed()).toBe(true);
expect(headerPage.claimSearch.isDisplayed()).toBe(true);
expect(headerPage.claim.isDisplayed()).toBe(true);
expect(headerPage.case.isDisplayed()).toBe(true);
expect(headerPage.calendar.isDisplayed()).toBe(true);
С одной стороны, наличие нескольких простых ожиданий обеспечивает более точную и понятную обратную связь, но, с другой стороны, похоже, что это нарушает принцип DRY и общепринятое правило "одно ожидание на тест".
Есть ли способ конвертировать/упростить его до одного ожидания?
headerPage
- это объект страницы, dashboard
и другие поля объекта страницы - это ссылки для навигации.
Ответы
Ответ 1
Я думаю, вы неправильно поняли цель "одного ожидания за тест". Дело не в том, чтобы объединить кучу ожиданий в единое ожидание, а разделить ваши ожидания на отдельные тесты.
Чтобы следовать духу этого руководства, вы должны написать свои тесты следующим образом:
describe("The header page", function () {
var headerPage;
beforeEach(function () {
//Common logic here
});
it("displays the dashboard", function () {
expect(headerPage.dashboard.isDisplayed()).toBe(true);
});
it("displays the queue", function () {
expect(headerPage.queue.isDisplayed()).toBe(true);
});
it("displays the claimSearch", function () {
expect(headerPage.claimSearch.isDisplayed()).toBe(true);
});
//etc.
});
Это справедливое немного более подробное, чем то, что у вас есть; но почему это не руководящие принципы. Это компромисс между тем, насколько подробно вы делаете свои тесты, а также тем, насколько легко их отлаживать позже. ( "Страница заголовка отображает панель управления: FAILED" ) является очень четким и конкретным сообщением об ошибке, по сравнению с получением того же сообщения об ошибке, независимо от того, какое ожидание действительно не удалось.
Я определенно не буду пытаться объединить все эти строки в одну строку. Если вы не хотите разбить его на кучу разных тестовых случаев, я просто оставлю это как.
Ответ 2
Альтернативный подход. То, что я закончил, это добавить метод объекта страницы, который возвращает метки видимых в данный момент навигационных ссылок:
this.getVisibleLinks = function () {
return $$(".ap-header-nav-tabs li a").filter(function (link) {
return link.isDisplayed();
}).getText();
};
Затем вышеуказанный тест будет преобразован в сжатый и читаемый:
expect(headerPage.getVisibleLinks()).toEqual(["Dashboard", "Queue", "Claim Search", ...]);
Ответ 3
Если это логика, которую вы используете по нескольким спецификациям, вы можете изучить jasmine пользовательские сопоставления для инкапсуляции логики.
Было бы написано несколько так:
var customMatchers = {
toDisplayWidgets: function(util, customEqualityTests) {
return {
compare: function(actual, expected) {
function isDisplayingWidgets(page) {
return page.dashboard.isDisplayed() &&
page.queue.isDisplayed() &&
page.claimSearch.isDisplayed() &&
page.claim.isDisplayed() &&
page.case.isDisplayed() &&
page.calendar.isDisplayed();
}
var result = {};
result.pass = isDisplayingWidgets(actual);
if (!result.pass) {
result.message = 'dashboard is not displayed';
}
return result;
}
}
}
Добавить совпадение к текущему тесту
jasmine.addMatchers(customMatchers);
И тогда в ваших тестах вы можете просто утверждать с помощью
expect(headerPage).toDisplayWidgets();
Ответ 4
как насчет использования вспомогательной функции, которая возвращает результаты всех тестов, что-то вроде
expect(headerDisplayTests()).toBe(true);
function headerDisplayTests() {
return headerPage.dashboard.isDisplayed() &&
headerPage.queue.isDisplayed() &&
headerPage.claimSearch.isDisplayed() &&
headerPage.claim.isDisplayed() &&
headerPage.case.isDisplayed() &&
headerPage.calendar.isDisplayed();
}