2

テストの前にディレクトリのツリーを作成し、結局それを削除しようとしています。

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

sの順序console.logはOKです:

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()ですか?

4

1 に答える 1

7

テストの終了が速すぎます。afterの非同期バージョンを使用する必要があります。

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

出力する必要があります:

 after
 after_end
 rmdir!

から呼び出すと機能するように見える理由before()は、他にもたくさんのことが起こっているため、rmdirが呼び出されますが、後でノードがイベントループに戻るときに呼び出されます。

于 2013-02-26T04:01:18.827 に答える