我需要在集成测试之前创建一些文件:
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();
的问题。如果我想让它以正确的方式完成,那么这段代码应该如何呢?
答案 0 :(得分:0)
问题是它是异步尝试打开文件,并在返回所有fs函数之前点击done()。
只需更改所有内容即可使用fs.mkdirSync和fs.openSync。同步是同步的,因此您不需要回调;执行将暂停直到fs返回。这在网络服务器中会很糟糕,其中所有其他工作都会停止,但在测试中很好。