【问题标题】:AngularJS e2e Testing: How To Get value of repeater().count()?AngularJS e2e 测试:如何获取 repeater().count() 的值?
【发布时间】:2013-01-28 16:52:29
【问题描述】:

问题

调用repeater('#myTable tr','Rows').count(); 返回Future,而不是整数。我需要获取整数值,以便确认向表中添加了额外的行。

代码

it('should add a new user when save button is clicked',function()
    {
        showModal();

        //here I'm trynig to store the row count of my table into  a local variable.
        //a future is returned who's 'value' field is undefined.
        var memberCount = repeater('#memberTable tr','Member Rows').count();

        //this outputs 'undefined'
        console.log(memberCount.value);


        input('editedMember.name').enter('John');
        input('editedMember.grade').enter(5);
        input('editedMember.ladderPosition').enter(3);

        element('#saveMemberButton').click();
        sleep(1);
        expect(element(modalId).css('display')).toBe('none');

        //here is where I want to do the comparison against the above stored memberCount
        expect(repeater('#memberTable tr', 'Member Rows').count()).toBe(memberCount.value + 1);


    });

测试结果

Chrome 25.0 e2e should add a new user when save button is clicked FAILED
    expect repeater 'Member Rows ( #memberTable tr )' count toBe null
    /Users/jgordon/learning/chessClub/web-app/test/e2e/scenarios.js:45:3: expected null but was 6
Chrome 25.0: Executed 2 of 2 (1 FAILED) (1 min 4.117 secs / 1 min 3.773 secs)

【问题讨论】:

    标签: angularjs karma-runner end-to-end


    【解决方案1】:

    深入研究 Angularjs 的 e2e 支持的源代码表明,您必须在 Future 上调用 execute() 以使其填充其值。此外,当您调用 execute 时,您必须向 execute() 提供“完成”功能,否则 Testacular 将(奇怪的是!)跳过您的测试。

    代码

    var rowCountFuture = repeater('#memberTable tr','Member Rows').count();
            
            rowCountFuture.execute(function(){
            });
            
            var memberCount = rowCountFuture.value;
    

    虽然我很高兴看到这个作品,但我担心可能会出现一些异步错误,而且,我觉得这是一个 hack,而不是正确的方法。有什么想法吗?

    【讨论】:

    • 我也遇到了这个问题,能否请您详细说明一下您的解决方案?如果可以提供代码示例,那将非常有帮助!谢谢!
    • 像上面第一行一样调用count() 方法。这将返回一个Future——当您调用execute() 方法时,该对象将获取您的转发器的计数。传入一个空函数来满足它。在调用execute() 之后,您可以通过访问Futurevalue 属性来获取行数。
    • 我已经尝试过了,但是我收到下一个错误:“框架窗口无法访问。”
    • 我重新审视了这个,发现我也遇到了同样的错误。我想知道是否有一些更新改变了这种行为。我将此标记为未答复。
    • 辉煌。这就是让 Angular 很难上手的原因,但同时又非常令人兴奋和强大。
    【解决方案2】:

    基于最新的 Protractor 版本:

    it('should add a new user when save button is clicked', function() {
        var memberCount;
        element.all(by.repeater('#memberTable tr','Member Rows')).count().then(function(value) {
            memberCount = value;
        });
        ...
        // then do all your entering user info, saving etc.
        ...
        browser.refresh(); // or however you want to load new data
        expect(element.all(by.repeater('#memberTable tr','Member Rows')).count()).toEqual(memberCount + 1);
    });
    

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,并且在测试value 时看到了令人困惑的结果,调用execute() 之后返回。我发现这种方法更可靠:

      var getCount = repeater('ul li').count();
      getCount.execute(function(value) {
          expect(value).toEqual(3);
      });
      

      【讨论】:

      • 谢谢,大卫。我去看看。
      【解决方案4】:

      您可以在定位器返回的异步承诺中最轻松地做到这一点

      element.all(By.repeater 'thing in things').then(function(elements){
            count = elements.length;
            expect(count).toEqual(3);
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-30
        • 1970-01-01
        相关资源
        最近更新 更多