Тест Angular e2e для проверки списка элементов

Мой случай таков: у меня есть простая страница со списком доступных продуктов:

<ul class="products ng-scope" id="products">
  <!-- ngRepeat: tag in products -->
  <li ng-repeat="product in products" class="ng-scope">
    <a ng-href="/#/viewProduct/1" class="ng-binding" href="/#/viewProduct/1">Product A</a>
  </li><li ng-repeat="product in products" class="ng-scope">
    <a ng-href="/#/viewProduct/2" class="ng-binding" href="/#/viewProduct/2">Product B</a>
  </li><li ng-repeat="product in products" class="ng-scope">
    <a ng-href="/#/viewProduct/3" class="ng-binding" href="/#/viewProduct/3">Product C</a>
  </li><li ng-repeat="product in products" class="ng-scope">
    <a ng-href="/#/viewProduct/4" class="ng-binding" href="/#/viewProduct/4">Product D</a>
  </li><li ng-repeat="product in products" class="ng-scope">
    <a ng-href="/#/viewProduct/5" class="ng-binding" href="/#/viewProduct/5">Product E</a>
  </li>
</ul>

В моем угловом сценарии я хочу проверить, соответствует ли список продуктов ожидаемому. Я знаю, что это может/должен быть модульный тест, но предположим, что мне нужен тест e2e.

После прочтения официальных документов (http://docs.angularjs.org/guide/dev_guide.e2e-testing - которое как обычно покрывает 10% темы) и отладка углового кода мне удалось написать следующий тест:

'use strict';

describe('my app', function() {
  var productsList = [
    'Product A',
    'Product B',
    'Product C',
    'Product D',
    'Product E'
  ];

  it('should list all products', function() {
    browser().navigateTo('/#/products');
    var foundProducts = element('#products li').query(function(elements, done) {
      var productsArray = [];
      elements.each(function(index) {
        productsArray.push(elements[index].innerText);
      });

      done(null, productsArray);
    });

    expect(foundProducts).toEqual(productsList);
  });
});

Подскажите, пожалуйста, как это можно сделать проще?

И второй вопрос, почему elements[index].text() не определено, что на самом деле является вопросом, как вывести объект jQuery из elements[index].


person gnom1gnom    schedule 02.10.2013    source источник


Ответы (1)


Нашел решение:

describe('my app', function() {
  var productsList = [
    ['Product A'],
    ['Product B'],
    ['Product C'],
    ['Product D'],
    ['Product E']
  ];

  it('should list all products', function() {
    browser().navigateTo('/#/products');

    expect(repeater('#products li').count()).toEqual(productsList.length);

    for (var i = 0; i < productsList.length; i++) {
      expect(repeater('#products li').row(i)).toEqual(productsList[i]);
    }

  });
});
person gnom1gnom    schedule 02.10.2013
comment
Откуда repeater? - person Stefan; 30.05.2018