Построить тест Mocha динамически после получения данных от webdriver.io
Я ищу решение для определения тестов Mocha после асинхронного получения данных.
Сейчас я использую gulp-webdriver для получения HTML-контента с помощью Selenium. И я хочу проверить определенные HTML-теги структуры.
Например, я хочу получить всю структуру кнопок со страницы HTML.
1 ° В Мокко До () я получаю кнопки:
var buttons = browser.url("url").getHTML("button");
2 ° И после этого я хочу проверить каждую кнопку в отдельном it
:
buttons.forEach(function(button) { it() });
Единственное найденное решение - это загрузить HTML и извлечь кнопки с помощью Gulp перед запуском теста Mocha с плагином data_driven или leche.withData.
Знаете ли вы другое решение непосредственно в определении теста Мокко?
Заранее спасибо,
3 ответа
Кажется невозможным динамически создавать it() тесты с mocha.
Я наконец организовал свой тест так:
it('Check if all tag have attribute', function() {
var errors = [];
elements.forEach(function(element, index, array) {
var $ = cheerio.load(element);
var tag = $(tagName);
if (tag.length) {
if (!tag.attr(tagAttr)) errors.push(element);
}
});
expect(errors).to.be.empty;
}
}
Вы действительно можете создать динамический It()
тесты с мокко, если вы не против злоупотреблять before()
немного зацепить:
before(function () {
console.log('Let the abuse begin...');
return promiseFn().
then(function (testSuite) {
describe('here are some dynamic It() tests', function () {
testSuite.specs.forEach(function (spec) {
it(spec.description, function () {
var actualResult = runMyTest(spec);
assert.equal(actualResult, spec.expectedResult);
});
});
});
});
});
it('This is a required placeholder to allow before() to work', function () {
console.log('Mocha should not require this hack IMHO');
});
Mocha поддерживает два способа обработки асинхронности в тестах. Одним из способов является использование готового обратного вызова. Мокко постарается передать функцию во все ваши it
s, before
и т. д. Если вы принимаете done
обратный вызов, это ваша обязанность вызывать его, когда ваша асинхронная операция завершена. Стиль обратного вызова:
before(function(done) {
browser.url("url").getHTML("button").then(function() {
done();
});
});
Другой подход заключается в использовании обещаний. Поскольку ваш вызов getHTML возвращает обещание, вы можете просто вернуть это обещание, и Мокко будет знать, что нужно дождаться выполнения обещания, прежде чем что-либо предпринимать.
Вот пример стиля Promise:
before(function() {
return browser.url("url").getHTML("button");
});
Пара вещей, на которые стоит обратить внимание:
- getHtml()
возвращает обещание для кнопок HTML. Всякий раз, когда асинхронный вызов getHTML
завершается, функция передана в then
Функция вызывается и полученное значение от вызова к getHTML
Передача этого обещания в предыдущем позволяет mocha знать, что вы делаете что-то асинхронное. Мокко будет ждать выполнения этого обещания, прежде чем пройти мимо вашего "прежде".
Для вашего конкретного примера вы можете попробовать что-то вроде этого:
describe('the buttons', function() {
var buttons;
before(function() {
return browser.url("url").getHTML("button").then(function(result) {
buttons = result;
};
});
it('does something', function() {
buttons.forEach(function(button) {
});
});
});