NodeJS fs.appendFile在mocha中的promise中不起作用

时间:2016-12-02 14:46:16

标签: node.js promise mocha fs

我希望在集成测试套件中保留日志。我正在测试每个“项目”正在编译并记录它花了多少时间。我正在使用节点4.3

首先,我创建了日志文件:

before(function() {
    if (!fs.existsSync("./log.csv")) {
        fs.writeFile("./log.csv", "Name; Time");
    }
});

然后在每个it块中我会这样做:

for (const item of items) {    
    it('compiles', function() {
        return item.testCompile();
    });
}

item类有以下方法:

testCompile() {
    return this
        .buildItem()
        .then(result => {
            // whatever testing stuff
        });
}

buildItem() {
    return this
        .internalLogicForCompiling()
        .then(result => {
            // This is not appending anything 
            fs.appendFile("./log.csv", `${item.name}; ${result.compileTime}`);

            return result;
        });
}

到目前为止,文件已创建但从未更新过...任何线索我做错了什么?

PS:我假设如果文件不存在,fs应该抛出错误,但事实并非如此。

1 个答案:

答案 0 :(得分:1)

您的代码通常忽略了fs调用是异步的这一事实。承诺不是魔术。如果您使用的是异步但不使用promises的代码,那么您需要做的不仅仅是在promise中调用代码可以调用它。

解决此问题的最简单方法是使用fs.writeFileSyncfs.appendFileSync代替您拨打的电话。否则,你应该像这样写before

before(function(done) {
    if (!fs.existsSync("./log.csv")) {
        fs.writeFile("./log.csv", "Name; Time", done);
    }
});

我刚刚添加了done回调。

并且buildItem可能是这样的,以便它返回的承诺在appendFile完成其工作之前不会解决:

buildItem() {
    return this
        .internalLogicForCompiling()
        .then(result => {
            return new Promise((resolve, reject) => {
                fs.appendFile("./log.csv", `${item.name}; ${result.compileTime}`, (err) => {
                    if (err) {
                        reject(err);
                        return;
                    }
                    resolve(result);
                });
            });
        });
}