Mocha不会在after()函数中调用rmdir

cie*_*bor 2 javascript testing bdd mocha.js rmdir

我尝试在测试之前创建一些目录树,然后删除它:

require('should');
var fs = require('fs');
var rmdir = require('rmdir');

describe('FsWatcher', function() {
  before(function(done) {
    console.log("before");
    fs.mkdir('tmp');
    fs.mkdir('tmp/css');
    fs.mkdir('tmp/js');
    fs.mkdir('tmp/lib');
    fs.open('tmp/index.htm', 'w');
    // (...)
    console.log("after_before");
    done();
  });

  describe('single file', function() {
    it('should succed', function(done) {
      (1).should.equal(1);
      done();
    });
  });

  after(function() {
    console.log("after");
    rmdir('tmp', function() {
        console.log("rmdir!");
    });
    console.log("after_end");
  });
});
Run Code Online (Sandbox Code Playgroud)

console.logs 的顺序没问题:

mocha `find tests -name '*.js'`

  before
after_before
?after
after_end


  ? 1 test complete (6 ms)
Run Code Online (Sandbox Code Playgroud)

但它不会调用rmdir().同样的rmdir在它结束时起作用before():

describe('FsWatcher', function() {
  before(function(done) {
    console.log("before");
    fs.mkdir('tmp');
    fs.mkdir('tmp/css');
    fs.mkdir('tmp/js');
    fs.mkdir('tmp/lib');
    fs.open('tmp/index.htm', 'w');
    // (...)
    console.log("after_before");
    rmdir('tmp', function(){
        console.log("rmdir!");
    });
    done();
  });
});
Run Code Online (Sandbox Code Playgroud)

安慰:

mocha `find tests -name '*.js'`

  before
after_before
 rmdir!
after
after_end
Run Code Online (Sandbox Code Playgroud)

为什么它不起作用after()

Pas*_*cle 6

测试结束得太快了.您需要使用after的异步版本.

after(function(done) {
    console.log("after");
    rmdir('tmp', function() {
        console.log("rmdir!");
        done();
    });
    console.log("after_end");
});
Run Code Online (Sandbox Code Playgroud)

哪个应该输出:

 after
 after_end
 rmdir!
Run Code Online (Sandbox Code Playgroud)

当你调用它时它似乎工作的原因before()是因为还有很多其他的事情发生,所以rmdir会被调用,但后来当节点返回到事件循环时.