在量角器中循环地图功能

时间:2015-06-26 16:18:00

标签: javascript angularjs protractor

我有一个有角度的应用程序,我有一个列表事件日期的时间表和相应的事件描述。这是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个事件中的最后一个事件。它不会打印其他事件。我肯定做错了什么。我是承诺的全新,所以任何建议都值得赞赏。是的,我想对时间线中的每个事件进行单独测试。

3 个答案:

答案 0 :(得分:4)

问题出在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"
    }, 
]);

答案 1 :(得分:0)

我建议您不要在测试中使用逻辑 - 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);
 })

答案 2 :(得分:0)

在我的案例中,转发器有很多元素。我不想重复所有元素,因为我的量角器规范在循环这么多元素时会超时。如何限制循环仅针对转发器的前10个元素运行?我尝试了很多东西,但我无法让这个工作。使用map()

时,如何仅循环转发器的前10个元素

上例中的时间轴变量返回转发器中所有元素的数据。我怎样才能获得时间轴变量来获取转发器的前10个元素的数据,因为循环通过1000个转发器的条目是耗时的,这导致我的量角器规范超时。