2017-01-20 51 views
0

我想測試我的過程並確保它對EPIPE錯誤有彈性,因爲我們在Prod中看到它們,並且除了缺少某些日誌記錄外,它們似乎沒有任何問題。有沒有辦法拋出像ENOENT或EPIPE這樣的系統錯誤?

if (process.env.TESTFAIL != null) { 
setTimeout(function() { 
    throw new Error('EPIPE'); 
}, 1000); 

}

這並沒有看起來是一樣的,雖然,一個EPIPE錯誤的樣子:

Error: write EPIPE 
at errnoException (net.js:770:11) 

也試過throw new Error({code: 'EPIPE', errno: -3})等,但它只是看起來不一樣。

有沒有辦法從nodejs objects中獲取代碼/消息並拋出系統錯誤?

回答

0

不,沒有辦法精確「拋出」ENOENTEPIPE或類似。

簡而言之,它們不是JavaScript或編程語言意義上的錯誤或例外。它們是system error codes,它們是在某些條件適用時通過系統調用或標準庫例程返回(或存儲)的整數。 (通常在Unix或Linux系統上,雖然其他操作系統採用了相同的命名法)。

如果您想以有意義的方式重新創建它們以進行測試,則需要創建觸發它們的條件。例如。當您嘗試打開不存在的文件(路徑)時,會發生ENOENT。試圖在您的測試代碼中重新創建產生ENOENT的條件。你可以開始,然後打破管道獲得EPIPE。這是重新創建這些條件的唯一有意義的方法。

有可能看到一個錯誤在JavaScript的水平自稱EPIPE說,它有可能拋出EPIPE值(32)或Error嵌入要麼EPIPE值或字符串'EPIPE'。那些更高級別的錯誤表現只是真實錯誤狀況的結果。如果您希望您的代碼針對潛在問題進行測試,則通常必須創建基本情況。 「你通常必須創造潛在的情況。」

+0

「瞭解瞭如何爲EPIPE做到這一點?這似乎是最有可能出現的一個藍色(寫入日誌等) – jcollum

+0

當然。啓動一個管道到外部進程,然後當數據仍在傳輸時,用一個信號(例如'SIGINT'或'SIGKILL')殺死外部進程。與大多數單元測試相比,這是一個很難/很複雜的事情,可能屬於集成測試的標題。但是這樣做對測試'EPIPE'處理來說既是必要也是充分的。像Unix這樣的實用程序是發出無限序列的程序,可以用於這種測試。 –

相關問題