【问题标题】:Simplifying multiple boolean checks into a single one将多个布尔检查简化为一个
【发布时间】:2016-05-16 17:42:20
【问题描述】:

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

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

【问题讨论】:

    标签: javascript testing jasmine protractor dry


    【解决方案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 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();
      

      【讨论】:

        【解决方案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();
        }
        

        【讨论】:

        • 谢谢,我想到了“提取方法”的技巧,但这不会像现在这样工作,因为isDisplayed() 返回一个承诺..protractor.promise.all() 这里需要。请看看您是否可以调整答案以考虑到这一点。
        • 如果 isDisplay() 返回一个承诺,那么您的示例将如何 expect(headerPage.dashboard.isDisplayed()).toBe(true);曾经工作过吗?
        • 是的,因为量角器已经修补了期望以隐式解决承诺..
        • 如果这样的期望失败了,你将很难找出它的哪一部分被破坏了。
        猜你喜欢
        • 2020-04-29
        • 1970-01-01
        • 2013-12-19
        • 2014-01-16
        • 1970-01-01
        • 2021-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多