2013-08-21 57 views
0

我需要集成測試之前先創建一些文件:摩卡,集成JS測試和異步IO

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

問題是,它是異步嘗試打開文件,並在所有fs函數返回之前敲擊done()。

只需更改所有內容以使用fs.mkdirSync和fs.openSync。同步是同步的,所以你不需要回調;執行將暫停,直到fs返回。這在Web服務器中會很糟糕,所有其他工作都會停下來,但在測試中會很好。