Упрощение нескольких булевых проверок в один

В одном из наших тестов мы имеем следующий набор ожиданий:

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();
}