2016-05-16 5 views
11

В одном из наших тестов, мы имеем следующий набор ожиданий:Упрощая несколько логических проверок в один

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 является Page Object, dashboard и другие поля страницы объектных ссылок навигации.

ответ

15

Я думаю, вы поняли цель «один ожидание на тест» руководства. Дело не в том, чтобы объединить множество ожиданий в единое ожидание, а в том, чтобы разделить ваши ожидания на отдельные тесты.

Чтобы следовать духу этого основного положения, вы должны написать тесты, как это:

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») является очень четким и конкретным сообщением об ошибке, по сравнению с получением того же сообщения об ошибке, независимо от того, какое ожидание действительно не удалось.

Я определенно не пытался объединить все эти строки в одну строку. Если вы не хотите разбить его на кучу разных тестовых случаев, я просто оставлю его таким, как есть.

+0

Это имеет смысл. Я также думаю о приближении к нему по-другому - иметь метод объекта страницы, который бы возвращал текущие видимые навигационные ссылки и утверждал это вместо этого. Также опубликует здесь, когда будет готов. Спасибо! – alecxe

+0

FYI, опубликовал то, что у меня получилось. – alecxe

-1

, что об использовании вспомогательной функции, которая возвращает результаты всех тестов, что-то вроде

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

Спасибо , Я подумал о трюке «Извлеките метод», но это не сработает, так как 'isDisplayed()' возвращает обещание ..'protracto r.promise.all() 'понадобится здесь. Посмотрите, можете ли вы отрегулировать ответ, чтобы принять это во внимание. – alecxe

+0

Если isDisplay() возвращает обещание, тогда как ваш пример ожидания (headerPage.dashboard.isDisplayed()). ToBe (true); когда-нибудь работаешь? – nuway

+0

Да, потому что транспортир имеет ожидаемое исправление, чтобы неявно разрешить обещания. – alecxe

1

Альтернативный подход. То, что я закончил с было добавить метод страницы объекта, который возвращает метки текущей видимой навигации ссылки:

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", ...]); 
1

Если это логика, которую вы используете по нескольким спецификациям, вы можете изучить жасмин custom matchers, чтобы инкапсулировать логику.

Это было бы написано примерно так:

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(); 
Смежные вопросы