Как я могу использовать функции 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();
});
});