Nodejs mocha异步之done
Nodejs mocha异步之done
今天看了一下mocha,前面的同步比较好理解,但是到异步的时候遇到了done,不太清楚,done方法做了什么,到网上都没找到特别好的例子。经过查找,看到了这篇文章 http://lostechies.com/derickbailey/2012/08/17/asynchronous-unit-tests-with-mocha-promises-and-winjs/ ,写的比较全。下面对done简单说明。 如下面的code:
var assert = require(“assert”);
describe(“a test”, function(){
var foo = false;
beforeEach(function(){
// simulate async call w/ setTimeout
setTimeout(function(){
foo = true;
}, 50);
});
it(“should pass”, function(){
assert.equal(foo, true);
});
});
开始,你可能会认为这个测试应该通过。当assert时认为“foo”变量被设置为true,因为在setTimeout中,它设置为true。但测试失败,因为assert运行在setTimeout的回调被调用之前。
现在done出场,这个“done”参数,在回调函数存在时,告诉mocha,你正在编写一个异步测试。这将导致mocha进入一个计时器,等待异步函数来完成 - 这时要么调用done()
函数,或者超过2秒导致超时。
如下:
var assert = require(“assert”);
describe(“a test”, function(){
var foo = false;
beforeEach(function(done){
setTimeout(function(){
foo = true;
// complete the async beforeEach
done();
}, 50);
});
it(“should pass”, function(){
assert.equal(foo, true);
});
});
现在能测试通过了,至于两秒的问题,你把等待50,该为2000,哈哈。
还有一个问题是,在好多地方查到done方法是只有执行了done方法,下面的code才会执行下一步,但这个下一步不太清楚,在此说明:
继续看code:
describe(‘done’, function(){
it(‘done test’, function(done){
setTimeout(function(){
done();
}, 1900);
});
it(“done test1”, function(){
console.log(“it里的输出”);
});
console.log(“it外的输出”);
}) ;
运行后,"it外的输出“先输出,证明,done只能控制后面的it里的方法。
Node.js Mocha 异步之 done
今天,我学习了一下 Mocha 测试框架,发现同步测试相对容易理解,但在处理异步操作时遇到了一些问题。特别是 done
方法,它在异步测试中起着关键作用。本文将简要介绍 done
方法的作用,并通过示例代码来说明其使用方法。
什么是 done
方法?
在 Mocha 中,当你需要测试异步代码时,可以使用 done
回调函数来通知 Mocha 当前的异步操作已经完成。如果没有正确地调用 done
,Mocha 会默认认为测试超时,从而导致测试失败。
示例代码
假设我们有一个简单的测试场景,其中包含一个异步操作(例如 setTimeout
),我们需要确保这个操作完成后才进行断言:
var assert = require("assert");
describe("a test", function() {
var foo = false;
// 使用 done 来标记这是一个异步的 beforeEach 钩子
beforeEach(function(done) {
setTimeout(function() {
foo = true;
// 调用 done 表示异步操作已完成
done();
}, 50);
});
it("should pass", function() {
assert.equal(foo, true);
});
});
在这个例子中,beforeEach
钩子模拟了一个异步操作(setTimeout
)。由于 Mocha 需要知道何时结束这个异步操作,因此我们在 setTimeout
的回调函数中调用了 done()
。这样,Mocha 就知道异步操作已经完成,并且可以继续执行后续的测试步骤。
另一个示例
为了更好地理解 done
的作用范围,我们可以再看一个稍微复杂的例子:
describe('done', function() {
it('done test', function(done) {
setTimeout(function() {
console.log("done test completed");
done();
}, 1900);
});
it("done test1", function() {
console.log("it里的输出");
});
// 这行代码在两个 it 块之外
console.log("it外的输出");
});
在这个例子中,it
块之间的顺序是不确定的。done
只影响当前的 it
块。因此,即使 done test
在 done test1
之后定义,it外的输出
总是在所有 it
块之前输出。这是因为 it
块之间是并行执行的,而 done
只控制当前 it
块的执行顺序。
结论
done
方法是 Mocha 处理异步测试的关键。通过在异步操作完成后调用 done()
,你可以确保 Mocha 知道何时结束异步操作,并继续执行后续的测试步骤。希望这些示例代码和解释能够帮助你更好地理解和使用 Mocha 的异步测试功能。
done
方法是 Mocha 框架用来处理异步操作的一种方式。当你有一个需要异步执行的任务时(例如,读取文件、网络请求等),你需要告诉 Mocha 任务何时完成。通过在回调函数中传入 done
参数,并在异步操作完成后调用 done()
,你可以确保 Mocha 知道什么时候可以继续执行后续的断言。
下面是一个简单的示例,展示了如何使用 done
来处理异步操作:
const assert = require('assert');
describe('a test', function() {
var foo = false;
// 使用 done 处理异步的 beforeEach 钩子
beforeEach(function(done) {
setTimeout(function() {
foo = true;
// 在 setTimeout 回调中调用 done() 表明异步操作已完成
done();
}, 50);
});
it('should pass', function() {
assert.equal(foo, true);
});
});
在这个示例中,beforeEach
钩子模拟了一个异步操作(这里使用 setTimeout
),并在操作完成后调用 done()
。这样,Mocha 知道何时可以继续执行下一个测试用例(即 it
块)。
关于你提到的 done
只能控制 it
中的方法,这是正确的。在上面的示例中,如果我们在 beforeEach
调用 done
之前执行 console.log("it外的输出")
,你会发现这条语句会先于异步操作的结果输出。这是因为 beforeEach
的异步操作是独立于 it
中的其他代码的,所以它们不会相互阻塞。因此,done
主要用于确保异步操作完成后再执行特定的测试逻辑。