【问题标题】:Looping over the map function in protractor在量角器中循环映射函数
【发布时间】:2016-05-18 15:57:13
【问题描述】:

我有一个 Angular 应用程序,其中有一个包含事件日期列表和相应事件描述的时间线。这是 Html 源代码。

  <!-- timeline -->
  <h4 class="font-thin m-t-lg m-b-lg text-primary-lt">Historical Timeline</h4>
  <p></p>
  <div id="timeline"class="timeline m-l-sm m-r-sm b-info b-l">
    <div  ng-repeat = "timeline in formattedTimelineData | orderBy : '-eventDate'">
      <div class = "tl-item">
        <i class="pull-left timeline-badge {{timeline.class}} "></i>
        <div class="m-l-lg">
          <div id="eventDate{{$index}}" class="timeline-title">{{timeline.eventDate}}</div>
          <p id="eventDescription{{$index}}" class="timeline-body">{{timeline.description}}</p>
        </div>
      </div>
    </div>
  </div>
  <!-- / timeline -->

现在我基本上是在尝试使用量角器来确保正确的事件日期与事件描述相匹配。所以我决定使用地图功能。问题是我会有一个变量 x ,它会告诉我有多少事件。例如可以有 2 个事件、6 个事件等。事件是动态的 动态生成,您也可以通过查看 html 代码来判断。这是我编写的测试代码。

it('FOO TEST', function(){


    var x = 0;
    while(x<4){
   var timeline = element.all(by.css('#timeline')).map(function (timeline) {
       return {
          date: timeline.element(by.css('#eventDate'+x)).getText(),
          events: timeline.element(by.css('#eventDescription'+x)).getText()
     }

   });
      x++
  }

   timeline.then(function (Value) {
    console.log(Value);  
  });

});

问题是由于某种原因在命令行中它只打印了 5 个事件中的最后一个事件。它不打印其他事件。我肯定做错了什么。我是全新的承诺,所以这里的任何建议都值得赞赏。是的,我想对时间轴中的每个事件进行单独的测试。

【问题讨论】:

    标签: javascript angularjs protractor


    【解决方案1】:

    问题出在timeline 定位器中:#timeline 匹配时间线容器,而您需要内部重复时间线块。以下是如何匹配它们:

    var timeline = element.all(by.repeater('timeline in formattedTimelineData')).map(function (timeline) {
        return {
            date: timeline.element(by.binding('timeline.eventDate')).getText(),
            events: timeline.element(by.binding('timeline.description')).getText()
        }
    });
    
    timeline.then(function (timeline) {
        console.log(timeline);
    });
    

    然后您可以像这样循环遍历项目:

    timeline.then(function (timeline) {
        for (var i = 0; i < timeline.length; ++i) {
            // do smth with timeline[i]
        }
    });
    

    或者,您可以断言完整的 timeline 变量,这是一个承诺,可以由 expect 隐式解析为对象数组,例如:

    expect(timeline).toEqual([
        {
            date: "First date",
            events: "Nothing happened"
        },
        {
            date: "Second date",
            events: "First base"
        },
        {
            date: "Third date",
            events: "Second base"
        }, 
    ]);
    

    【讨论】:

    • 这会得到所有的事件和日期吗?
    • 是的。我赞成并肯定接受你的回答,因为它可以工作,但现在问题是,如果我想做某种循环遍历每个索引的循环并且这个检查是否可能?我知道您发布的解决方案绝对是一种“更好”的方法,但我只是好奇我是否想通过循环来实现它,因为我尝试了我该怎么做?如果您可以在答案下添加它,那将是很棒的!
    • 重点是如果可能的话,我可以对每个事件及其描述进行单独的测试。 it('event 1 test'), it('event 2 test') 等等。
    • @Dinero each() 也可能与用例有关。我不认为你可以动态创建 it() 块..
    • hmm 那么有没有办法单独检查每一个?也许为每个事件动态地做一个描述?
    【解决方案2】:

    我建议不要在测试中加入逻辑 - http://googletesting.blogspot.com/2014/07/testing-on-toilet-dont-put-logic-in.html

    while 循环是逻辑。

    您应该提前知道您的时间线中有多少事件。在示例案例 4 中。那么您的规格应该看起来像

    element.all(by.css("#timeline")).then(function(events){
        expect(events.count).toEqual(4);
        expect(events[0].someThing()).toEqual(expectedValue0);
        expect(events[1].someThing()).toEqual(expectedValue1);
    ...
        expect(events[3].someThing()).toEqual(expectedValue3);
     })
    

    【讨论】:

    【解决方案3】:

    在我的例子中,中继器有很多元素。我不想重复所有元素,因为我的量角器规范在循环这么多元素时超时。我怎样才能限制循环只为中继器的前 10 个元素运行?我已经尝试了很多事情,但我就是无法让它发挥作用。使用 map() 时如何仅循环遍历转发器的前 10 个元素

    上例中的时间线变量返回中继器中所有元素的数据。我怎样才能让时间轴变量只包含转发器的前 10 个元素的数据,因为循环遍历转发器的 1000 个条目非常耗时,这会导致我的量角器规范超时。

    【讨论】:

      猜你喜欢
      • 2015-08-24
      • 2018-01-18
      • 2020-11-29
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 2016-02-06
      相关资源
      最近更新 更多