2016-12-02 55 views
0

我想在我的集成測試套件中保留日誌。我正在測試每個'項目'正在編譯並記錄花了多少時間。我正在使用節點4.3NodeJS fs.appendFile在摩卡承諾中不起作用

首先我創建日誌文件:

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; 
     }); 
} 

到目前爲止文件已創建,但從未更新...任何線索我在做什麼G?

PS:我假設文件不存在,fs應該拋出一個錯誤,但它不會。

回答

1

你的代碼通常忽略了你的fs調用是異步的。承諾並不神奇。如果您使用的是異步但不使用承諾的代碼,那麼您需要做的不僅僅是將承諾中的代碼翻譯成完成。

解決此問題的最簡單方法是使用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); 
       }); 
      }); 
     }); 
} 
+0

嗨,在'return'我有它已經。同步方法似乎工作確定:) – josemigallas