Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Mocha测试用例中使用setTimeout()函数?_Javascript_Node.js_Mocha.js - Fatal编程技术网

Javascript 如何在Mocha测试用例中使用setTimeout()函数?

Javascript 如何在Mocha测试用例中使用setTimeout()函数?,javascript,node.js,mocha.js,Javascript,Node.js,Mocha.js,我正在用Mocha/Node js编写一个测试,并希望在执行代码块之前使用setTimeout等待一段时间 我怎样才能做到这一点 似乎在Mocha测试用例中,setTimeout()不起作用。(我知道您可以为每个测试用例和每个测试文件设置超时,这不是我在这里需要的。) 在使用Node运行的js文件中,即,Node miniTest.js,这将等待3秒钟,然后在setTimeout函数内打印该行 miniTest.js 在使用Mocha运行的js文件中,即,Mocha smallTest.js,它

我正在用Mocha/Node js编写一个测试,并希望在执行代码块之前使用setTimeout等待一段时间

我怎样才能做到这一点

似乎在Mocha测试用例中,setTimeout()不起作用。(我知道您可以为每个测试用例和每个测试文件设置超时,这不是我在这里需要的。)

在使用Node运行的js文件中,即,
Node miniTest.js
,这将等待3秒钟,然后在setTimeout函数内打印该行

miniTest.js 在使用Mocha运行的js文件中,即,
Mocha smallTest.js
,它不会等待,并且将完成执行并退出,而不会在setTimeout函数中打印该行

smallTest.js:
让测试函数获取一个参数(通常称为
done
)。Mocha将传递一个您将在
setTimeout
函数中调用的函数(例如,在
console.log
call
done()
之后)


请参阅。

您忘记了在
中传递参数('tiny test case',function()
和call 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()。您可以省略before函数,在其中一个it函数中执行setTimeout,但它仍应在assert之后使用并调用done()

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();
  });

});

非常感谢你!这将运行并等待分配的时间。嗨-为什么需要添加
done
?如果只是一个包含许多步骤的测试,那么只需使用
this.timeout=60000
?@userMod2是的,只要代码是同步的,一步一步地运行每个步骤,设置一个超时就足够了。但是OP中的代码(使用
setTimeout
的任何代码)是异步的,这意味着它会立即返回,函数参数会在将来运行。可以理解的是,混淆了这里有两种叫做“超时”的东西:<代码> Time.TimeOut[x意味着“如果我的测试运行得比XMs长,就认为它是一个失败”。code>setTimeout(function,x)表示“等待x毫秒后,运行我的函数”。如何在新的异步等待语法中执行此操作?
done
应在
it
中传递,而不是在
description
中传递。在新的异步等待语法中如何做到这一点?在新的异步等待语法中如何做到这一点?
done("Test Failed");
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();
  });

});