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里的方法。


2 回复

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 testdone 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 主要用于确保异步操作完成后再执行特定的测试逻辑。

回到顶部