2015-11-30 8 views
4

Я ищу решение для определения тестов Mocha после получения данных асинхронно.Build Mocha test динамически после получения данных от webdriver.io

На данный момент я использую 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 плагином.

Знаете ли вы другое решение непосредственно в определении теста Mocha?

Спасибо заранее,

ответ

1

Это не представляется возможным динамически создавать его() тесты с мокко.

Я, наконец, организовать мой тест, как это:

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; 
    } 
} 
1

мокко поддерживает два способа обработки асинхронность в тестах. Один из способов - использовать сделанный обратный вызов. Mocha попытается передать функцию во все ваши it s, before s и т. Д. Если вы принимаете обратный вызов done, вы должны его активировать, когда ваша асинхронная операция завершена. Ответный стиль:

before(function(done) { 
    browser.url("url").getHTML("button").then(function() { 
     done(); 
    }); 
}); 

Другой подход заключается в использовании Promises. Поскольку ваш призыв 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) { 
    }); 
    }); 

}); 
+0

Благодарим Вас за ваш полный ответ, но то, что я хочу сделать, это использовать результат кнопок для создания теста 'it'. Что-то вроде этого: 'buttons.forEach (function (button) {it ('does something', function() {});});' –

2

Вы действительно можете создавать динамические 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'); 
}); 
+0

Что обещаетFn() в этом контексте? –

+1

@Wexoni 'promFn()' представляет любую асинхронную операцию на основе обещаний, которую необходимо выполнить перед динамическим генерированием тестов. OP хотел «определить тесты Mocha после получения данных асинхронно», поэтому возвращение обещания javascript в обратном вызове 'before' на корневом уровне, который завершается, когда вы готовы к асинхронным данным, делает трюк. В противном случае вы ограничены только синхронными операциями. – rob3c

+0

Я боюсь, что я не получу его :(У меня есть основной тест, который вызывает другой файл-помощник, и там создаются некоторые другие тесты. Основные тестовые прогоны, и если есть какие-либо другие тесты, сгенерированные в вспомогательном файле, они вернулся и в Main, и мне также нужно их рунитировать. Как я могу это достичь? Я задал вопрос относительно SO. http://stackoverflow.com/questions/42508514/mocha-run-test-inside- the-beforeeach-hook? noredirect = 1 # comment72157223_42508514 –