Mocha,集成JS测试和异步IO

时间:2013-08-21 15:38:44

标签: javascript node.js asynchronous mocha fs

我需要在集成测试之前创建一些文件:

before(function(done) {
    fs.mkdir('tmp');
    fs.mkdir('tmp/css');
    fs.mkdir('tmp/js');
    fs.mkdir('tmp/lib');
    fs.open('tmp/index.htm', 'w');
    fs.open('tmp/some.js', 'w');
    fs.open('tmp/some.css', 'w');
    fs.open('tmp/css/main.css', 'w');
    fs.open('tmp/css/sub.css', 'w');
    fs.open('tmp/js/main.js', 'w');
    fs.open('tmp/lib/jquery.js', 'w');
    done();
});

问题是,我得到了:

fs: missing callback Error: ENOENT, mkdir 'tmp/css'
fs: missing callback Error: ENOENT, mkdir 'tmp/js'
fs: missing callback Error: ENOENT, mkdir 'tmp/lib'
fs: missing callback Error: ENOENT, open 'tmp/css/main.css'
fs: missing callback Error: ENOENT, open 'tmp/css/sub.css'
fs: missing callback Error: ENOENT, open 'tmp/js/main.js'
fs: missing callback Error: ENOENT, open 'tmp/lib/jquery.js'

我认为问题是,它试图在创建目录之前同步打开文件。我可以使用fs.mkdirSync并将回调传递给每个,但后来我遇到done();的问题。如果我想让它以正确的方式完成,那么这段代码应该如何呢?

1 个答案:

答案 0 :(得分:0)

问题是它是异步尝试打开文件,并在返回所有fs函数之前点击done()。

只需更改所有内容即可使用fs.mkdirSync和fs.openSync。同步是同步的,因此您不需要回调;执行将暂停直到fs返回。这在网络服务器中会很糟糕,其中所有其他工作都会停止,但在测试中很好。