将多个布尔检查简化为单个布尔检查

时间:2016-05-16 17:42:21

标签: javascript testing jasmine protractor dry

在我们的一项测试中,我们有以下一系列期望:

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和其他页面对象字段是导航链接。功能

4 个答案:

答案 0 :(得分: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")是一个非常明确和特定的测试失败消息,与获得相同的失败消息相比,无论实际失败的是哪个期望。

我绝对不会尝试将所有这些线组合成一行。如果你不想将它分成许多不同的测试用例,我会留下它的样子。

答案 1 :(得分: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", ...]);

答案 2 :(得分:1)

如果这是您在多个规范中使用的逻辑,那么您可以查看jasmine 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();

答案 3 :(得分:-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();
}