我希望在集成测试套件中保留日志。我正在测试每个“项目”正在编译并记录它花了多少时间。我正在使用节点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
应该抛出错误,但事实并非如此。
答案 0 :(得分:1)
您的代码通常忽略了fs
调用是异步的这一事实。承诺不是魔术。如果您使用的是异步但不使用promises的代码,那么您需要做的不仅仅是在promise中调用代码可以调用它。
解决此问题的最简单方法是使用fs.writeFileSync
和fs.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);
});
});
});
}