Построить тест 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 поддерживает два способа обработки асинхронности в тестах. Одним из способов является использование готового обратного вызова. Мокко постарается передать функцию во все ваши its, 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) {  
     }); 
   }); 

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