0

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

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();. 如果我想让它以正确的方式完成,这段代码应该是什么样子?

4

1 回答 1

0

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

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

于 2013-08-21T23:03:00.553 回答