有一些mocha测试需要先前函数调用的数据,但之后因为它使用了web服务,并且希望它在运行下一个测试之前等待预定的时间,例如:
var global;
it('should give some info', function(done) {
run.someMethod(param, function(err, result) {
global = result.global
done();
});
});
wait(30000); // basically block it from running the next assertion
it('should give more info', function(done) {
run.anotherMethod(global, function(err, result) {
expect(result).to.be.an('object');
done();
});
});
任何想法都将不胜感激。谢谢!
答案 0 :(得分:17)
setTimeout肯定会有所帮助,但可能有一种“更清洁”的方式来做到这一点。
docs actually says在测试异步代码时使用this.timeout(delay)
来避免超时错误,所以要小心。
var global;
it('should give some info', function(done) {
run.someMethod(param, function(err, result) {
global = result.global
done();
});
});
it('should give more info', function(done) {
this.timeout(30000);
setTimeout(function () {
run.anotherMethod(global, function(err, result) {
expect(result).to.be.an('object');
done();
});
}, 30000);
});
答案 1 :(得分:9)
虽然this.timeout()
会延长单个测试的超时时间,但它不是您问题的答案。 this.timeout()
设置当前测试的超时时间。
但不要担心,无论如何你应该没事。测试不是并行运行的,它们是串行完成的,因此您的全局方法不应该有问题。
答案 2 :(得分:1)
首先,对于正确的单元测试,您在测试之间永远不需要睡眠。如果确实需要睡眠,则意味着要测试的功能需要延迟才能完成其预期的任务,该任务必须在该函数内部进行处理,并需要进行一些异步等待或睡眠。从函数退出后,其生存期必须结束并且必须立即获得预期结果。
答案 3 :(得分:1)
第一
此主题有很好的答案!我个人喜欢@Flops答案(得到了我的认可)
第二:
为了尽可能地澄清这一点,这里的代码示例与我最终(测试和验证)的示例非常相似
function delay(interval)
{
return it('should delay', done =>
{
setTimeout(() => done(), interval)
}).timeout(interval + 100) // The extra 100ms should guarantee the test will not fail due to exceeded timeout
}
it('should give some info', function(done) {
run.someMethod(param, function(err, result) {
global = result.global
done();
});
});
delay(1000)
it('should give more info', function(done) {
run.anotherMethod(global, function(err, result) {
expect(result).to.be.an('object');
done();
});
});
附带说明:您还可以一个接一个地使用延迟功能,并且仍然保持一致性(测试顺序)
答案 4 :(得分:1)
就我而言,我在 RESTful API
中编写了一个 NodeJS
,它在本地操作一些文件。当我开始测试时,API 收到了多个请求,它让我的 API 同时操作机器中的这些文件,这导致了我的问题。
因此,我需要在这些 API 调用之间留出一些时间(1 sec
就足够了)。对我来说,解决方案如下:
beforeEach( async () => {
await new Promise(resolve => setTimeout(resolve, 1000));
console.log("----------------------");
});
现在,在每次 it()
测试之前,都会运行前一个函数,并且我在 API 调用之间有 1 秒的睡眠时间。
答案 5 :(得分:0)
这是另一个,使用诺言:
it('go, then stop', (done) => {
// this.skip();
go()
.then((response) => { console.log('go was called'); return response; })
.then(response => response.should.equal('acknowledged'))
.then(() => new Promise(resolve => setTimeout(() => { resolve(); }, 3000)))
.then(() => console.log('3 second wait is over'))
.then(() => stop())
.then(response => response.should.equal('acknowledged'))
.then(() => done());
}).timeout(15000);