Обработка утверждений в пользовательском помощнике

Я начал играть с CodeceptJs и начал работать довольно легко. В настоящее время я использую его с NightmareJs и все, кажется, в порядке.

Конкретная область, которую я тестирую, - это галерея, которая извлекает данные из интерфейса через JSONP, создавая список изображений, завернутых в <div>s.

Часть тестов, которые я реализую, выглядит следующим образом:

Feature('gallery')
Scenario('clicking on an element adds "selected" class', (I) => {
  I.amOnPage('/')
  I.seeElement('#gallery .col-md-3')
  I.click('#gallery .col-md-3')
  I.seeElement('#gallery .selected')
})

Теперь, поскольку элементы могут быть любым числом, в настоящее время он молча использует первый элемент, но для того, чтобы придать ему немного больше энтропии, я хотел выбрать элемент случайным образом, что-то вроде следующего

Scenario('clicking on an element adds "selected" class', (I) => {
  I.amOnPage('/')
  I.seeMoreThanElements('#gallery .col-md-3', 1)
  I.clickOnRandomElement('#gallery .col-md-3')
  I.seeElement('#gallery .selected')
})

Или даже лучше, если бы я мог получить список элементов, чтобы я мог решить, на какой из них нажать, например:

Scenario('clicking on an element adds "selected" class', (I) => {
  I.amOnPage('/')
  I.seeMoreThanElements('#gallery .col-md-3', 1)
  const elements = I.grabRandomElement('#gallery .col-md-3')
  const random = getRandomInt(1, elements.length)
  I.click(`#gallery .col-md-3:nth-child(${random})`)
  I.seeElement(`#gallery .col-md-3.selected:nth-child(${random})`)
})

Текущие доступные помощники не позволяют мне выполнять какие-то определенные действия, поэтому я начал реализовывать собственный обработчик, как описано в руководстве по адресу http://codecept.io/helpers/

В моей конфигурации у меня есть следующее:

"helpers": {
  "Nightmare": {
    "url": "http://localhost:3000"
  },
  "DOMElements": {
    "require": "./__tests__/helpers/domelements_helper.js"
  }
}

а также domelements_helper.js на данный момент выглядит так:

'use strict'
let assert = require('assert')

class DOMElements extends Helper {
  seeMoreThanElements (locator, count) {
    this.helpers['Nightmare']._locate(locator).then(function (els) {
      return assert(els.length >= count, `Found more than ${count} elements`)
    })
  }
}

module.exports = DOMElements

Это не - ясно - работает. Это где я немного запутался.

Прежде всего, я использую стандартную библиотеку утверждений Node.js, и, если есть необходимость, я с удовольствием перейду к чему-то более надежному, например, Protractor или Chai-as-обещано, но чем тоньше, тем лучше.

Во-вторых, в документации четко говорится следующее:

любой вспомогательный метод должен возвращать значение для добавления в цепочку обещаний

Что на самом деле не имеет смысла... Должен ли я вернуть обещание или я должен справиться со всем этим в then() заявление? Поскольку возвращение базового значения на самом деле мало что делает. Даже тогда, как я могу справиться с ошибочными утверждениями?

Я также видел клиентский скрипт Nightmare в базе кода, но я понятия не имею, полезен ли он для моего случая, так как я только начал копаться в базе кода, чтобы немного лучше понять, как настраивать и расширять CodeceptJs.

Любые указатели действительно ценятся

1 ответ

Решение

Так как никто, кажется, не зашел так далеко, я собираюсь добавить ответ, поскольку я, кажется, нашел, как эта штука работает, пройдя через кодовую базу и немного поняв, как она работает.

tl; dr: быстрое решение заключается в следующем:

/* __tests__/helpers/domelements_helper.js */
const assert = require('assert')

class DOMElements extends Helper {

  seeMoreThanElements (locator, count) {
    return this.helpers['Nightmare']._locate(locator)
      .then((elementsArray) => {
        if (elementsArray.length < count) {
          return assert.fail(elementsArray.length, count, `Found more than ${count} elements`)
        }
      })
  }
}

module.exports = DOMElements

Все работает, как обещания, и вы должны соответствующим образом обработать сбой, чтобы вся система могла изящно выйти из строя (сортировка).

Особенно _locate() возвращает обещание, и все должно обрабатываться асинхронно, хотя с точки зрения дизайна это кажется довольно неуклюжим, и это делает вещи особенно сложными для реализации, по крайней мере, в текущем состоянии.

Другие вопросы по тегам