Mocha没有't在after()函数中调用rmdir

Mocha doesn't call rmdir in after() function

本文关键字:函数 rmdir 调用 after 没有 Mocha      更新时间:2023-09-26

我试图在测试前创建一些目录树,并最终将其删除:

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

console.log s的顺序正常:

mocha `find tests -name '*.js'`
  before
after_before
․after
after_end

  ✔ 1 test complete (6 ms)

但它不调用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();
  });
});

控制台:

mocha `find tests -name '*.js'`
  before
after_before
 rmdir!
after
after_end

为什么它在after()中不起作用?

测试完成得太快。您需要使用after的异步版本。

after(function(done) {
    console.log("after");
    rmdir('tmp', function() {
        console.log("rmdir!");
        done();
    });
    console.log("after_end");
});

哪个应该输出:

 after
 after_end
 rmdir!

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