Как я могу использовать функции setTimeout() в тестовых случаях Mocha?

Я пишу тест в Mocha / Node js и хочу использовать setTimeout, чтобы подождать некоторое время, прежде чем выполнить блок кода.

Как я могу сделать это?

Похоже, что в тестовом случае Mocha setTimeout() не работает. (Я знаю, что вы можете установить TimeTimeout для каждого теста и для каждого файла теста, это не то, что мне нужно здесь.)

В js-файле запустите с Node, т.е. node miniTest.js, это подождет 3 секунды, а затем напечатает строку внутри функции setTimeout.

miniTest.js

console.log('waiting 3 seconds...');
setTimeout(function() {
    console.log('waiting over.');
}, 3000);

В js-файле запустите с Mocha, т.е. mocha smallTest.js, это не будет ждать, и завершит выполнение и завершит работу, даже не печатая строку внутри функции setTimeout.

smallTest.js:

mocha = require('mocha');

describe('small test', function() {
    it('tiny test case', function() {
        console.log('waiting 3 seconds...');
        setTimeout(function () {
            console.log('waiting over.')
        }, 3000);
    });
});

4 ответа

Решение

Вы забыли передать параметр в it('tiny test case', function() и вызовите done() после console.log в методе setTimeout.

describe('small test', function(){
   it('tiny test case', function(done){
       console.log('waiting 3 seconds');
       setTimeout(function(){
           console.log('waiting over.');
           done();
       }, 3000)
   })
})

Вы должны были передать в качестве параметра в своем тесте параметр, который будет вызван после прохождения теста.

Вы можете написать свой тест как

mocha = require('mocha');

describe('small test', function(done) {
    it('tiny test case', function() {
       console.log('waiting 3 seconds...');
       setTimeout(function () {
           console.log('waiting over.');
           done();
       }, 3000);
    });

});

Это будет ждать 3 секунды, после чего будет напечатано "Ожидание закончено" и пройдет тест. Вы также можете иметь условие в течение времени ожидания в зависимости от того, выполнено ли условие или нет, вы можете пройти тест, позвонив

done();

или провалите тест, выдав ошибку или передав сообщение об ошибке в

done("Test Failed");

Пусть ваша тестовая функция принимает параметр (обычно называется done). Мокко передаст функцию, которую вы будете вызывать в setTimeout функция (например, после console.log вызов done()).

Смотрите https://mochajs.org/.

Это полный пример. Вам нужно вызывать done() в каждом утверждении, которое вы делаете. Вы можете опустить функцию before и выполнить setTimeout в одной из своих функций it, но она все равно должна использовать и вызывать done() после assert.

var foo = 1;
before(function(done) {
  setTimeout(function(){
    foo = 2;
    done();
  }, 500)
});

describe("Async setup", function(done){

  it("should have foo equal to 2.", function(done){
    expect(foo).to.be.equal(2);
    done();
  });

  it("should have foo not equal 3.", function(done){
    expect(foo).to.be.not.equal(3);
    done();
  });

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