Как я могу выполнить асинхронные тесты Mocha (NodeJS) в порядке?
Этот вопрос относится к среде тестирования Mocha для NodeJS.
Поведение по умолчанию, похоже, должно начинать все тесты, а затем обрабатывать асинхронные обратные вызовы по мере их поступления.
При выполнении асинхронных тестов я хотел бы запускать каждый тест после того, как была вызвана асинхронная часть той, которая была вызвана.
Как я могу это сделать?
Ответы
Ответ 1
Дело не в том, что "структурированный код работает в том порядке, в котором вы его структурировали" (изумление!), но, как предлагает @chrisdew, заказы на возврат для асинхронных тестов не могут быть гарантированы. Чтобы переформулировать проблему - тесты, которые находятся дальше по цепочке (синхронное выполнение) , не могут гарантировать, что требуемые условия, заданные асинхронными тестами, будут готовы к моменту их запуска.
Итак, если вам требуются определенные условия, которые должны быть установлены в первых тестах (например, маркер входа или аналогичный), вы должны использовать такие перехватчики, как before()
, которые проверяют эти условия перед тем, как продолжить.
Оберните зависимые тесты в блоке и запустите для них async before
(обратите внимание на "done" в предыдущем блоке):
var someCondition = false
// ... your Async tests setting conditions go up here...
describe('is dependent on someCondition', function(){
// Polls `someCondition` every 1s
var check = function(done) {
if (someCondition) done();
else setTimeout( function(){ check(done) }, 1000 );
}
before(function( done ){
check( done );
});
it('should get here ONLY once someCondition is true', function(){
// Only gets here once `someCondition` is satisfied
});
})
Ответ 2
Я удивляюсь тому, что вы написали, когда я использую. Я использую mocha с тестами стиля bdd (описать/он) и просто добавил некоторые тесты console.logs в свои тесты, чтобы проверить, сохраняются ли ваши претензии в моем случае, но, похоже, они этого не делают.
Вот фрагмент кода, который я использовал для просмотра порядка "end1" и "start1". Они были надлежащим образом заказаны.
describe('Characters start a work', function(){
before(function(){
sinon.stub(statusapp, 'create_message');
});
after(function(){
statusapp.create_message.restore();
});
it('creates the events and sends out a message', function(done){
draftwork.start_job(function(err, work){
statusapp.create_message.callCount.should.equal(1);
draftwork.get('events').length.should.equal(
statusapp.module('jobs').Jobs.get(draftwork.get('job_id')).get('nbr_events')
);
console.log('end1');
done();
});
});
it('triggers work:start event', function(done){
console.log('start2');
statusapp.app.bind('work:start', function(work){
work.id.should.equal(draftwork.id);
statusapp.app.off('work:start');
done();
});
Конечно, это могло произойти и случайно, но у меня много тестов, и если они будут работать параллельно, у меня определенно будут условия гонки, которых у меня нет.
Пожалуйста, обратитесь к этой проблеме из журнала отслеживания мокко. В соответствии с этим тесты выполняются синхронно.
Ответ 3
Я хотел решить эту же проблему с нашим приложением, но принятый ответ не помог нам. Особенно в someCondition
никогда не будет правдой.
Мы используем promises в нашем приложении, и это упростило структуру тестов. Ключ, однако, все же должен отложить выполнение с помощью before
hook:
var assert = require( "assert" );
describe( "Application", function() {
var application = require( __dirname + "/../app.js" );
var bootPromise = application.boot();
describe( "#boot()", function() {
it( "should start without errors", function() {
return bootPromise;
} );
} );
describe( "#shutdown()", function() {
before( function() {
return bootPromise;
} );
it( "should be able to shut down cleanly", function() {
return application.shutdown();
} );
} );
} );
Ответ 4
использовать mocha-steps
он сохраняет тесты последовательно, независимо от того, являются ли они асинхронными или нет (т.е. ваши функции done
все еще работают точно так же, как и они). Это прямая замена для it
, и вместо этого вы используете step