Обработка утверждений в пользовательском помощнике
Я начал играть с 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()
возвращает обещание, и все должно обрабатываться асинхронно, хотя с точки зрения дизайна это кажется довольно неуклюжим, и это делает вещи особенно сложными для реализации, по крайней мере, в текущем состоянии.