2016-02-23 18 views
0

我爲同一個文件創建一個WriteStreamReadStreamReadStream和WriteStream到nodejs中的同一個文件

我正在測試用於在磁盤上保存對象的代碼。

# Code 
g:(stream, cb)-> 
    stream.on("data", (chunk) -> chunks.push(chunk)) 
    stream.on("end",() -> cb(MyComplexObjectClass.decode(Buffer.concat(chunks))) 

# Test 
it "allows to persist MyComplexObject to disk", (done) -> 
    MyComplexObject = ... # Initialization code 
    _in = fs.createWriteStream("XXX") 
    out = fs.createReadStream("XXX") 
    _in.write(MyComplexObject.encode()) 
    _in.end() 
    g(out, (x) -> 
    # Validation of x here, should be MyComplexObject 
    done() 
) 

測試通過的就是三個問題:

  • 我相信,有競爭條件:當end叫上_in,變化可能不會被刷新到文件。如何在測試中重現競賽狀況?
  • 交換_inout的聲明使程序崩潰,但Uncaught SyntaxError: Unexpected end of input雖然文件存在,爲什麼?
  • 有沒有更好的方法來實現(仍然使用流)?

回答

0

這是一條評論,但太長,給我反饋,我會修改。

是否有一些令人信服的理由不使用JSON.stringify?或者是這樣的:

#assumes custom myObj#toString 
fs.writeFile "myObj.js", "module.exports = #{myObj.toString()}", (err) -> 
    if err then throw err 
    var importedObj = require 'myObj.js' 
    assert.equal myObj.toString(), importedObj.toString() 

我喜歡儘可能未來的傢伙流,甚至使用RXJS,讓他們在瀏覽器中,但是這似乎是一個奇怪的使用情況。

編輯

所以根據您的反饋,至少指向一個你做,簡單的答案是,你不能可靠地定義測試的競爭條件。如果可以的話,這不會是一個競爭條件。假定指令的非確定性交織。至於語法錯誤,每當我看到類似的東西時,我檢查輸出的javascript,它幾乎總是以我不打算的方式編譯的cs。

+0

我在我的實現中實際使用了JSON.stringify,這不是問題的要點: 1)如何證明競爭條件並測試它? 2)爲什麼交換崩潰? 3)我想用相同的文件執行測試,仍然 – lc2817

相關問題