3 回答

TA貢獻1816條經驗 獲得超4個贊
Go 中的模擬意味著擁有接口,如果這是你真正需要的東西,你可能會考慮使用https://github.com/spf13/afero之類的東西,而不是直接使用 os 包。這還允許您使用內存文件系統和其他使測試更容易的東西。

TA貢獻1797條經驗 獲得超6個贊
您可以使文件名/文件路徑可配置,而不是使用硬編碼的 info.log,然后在您的測試中您可以使用一些不存在的路徑。
有多種配置選項:
構造函數中的參數(如果您想保持 API 不變,也許可以從 New 調用一個單獨的構造函數)
包級別配置(如全局變量 defaultLogFileName),這不太靈活(例如,如果您想并行運行測試),但也可能適合這種情況

TA貢獻1813條經驗 獲得超2個贊
有兩件事需要考慮。
第一個是O_RDWR|O_CREAT|O_APPEND
在打開文件時幾乎沒有什么有趣的:它告訴操作系統應該以附加模式打開文件以進行讀寫,并且如果文件在調用時不存在,則應該被創建,否則可以追加到它上面。
現在我認為此操作可能失敗的唯一兩個原因是:
包含該文件的文件系統被掛載為只讀 - 因此打開文件進行寫入、創建文件并附加到文件是不可能的。
該文件不存在,并且文件系統的索引節點表已滿,因此即使有空間用于該文件的數據,也無法為另一個文件創建記錄。
現在考慮一下,為了模擬其中一種情況,您需要操作運行測試的進程可用的一些文件系統。雖然它當然可以在單元測試框架內完成,但它看起來更屬于集成測試領域。
在 Linux 上進行這一級別的測試有很多選擇:“flakey”設備映射器目標和朋友,通過循環設備或 FUSE 安裝只讀映像,將故障注入正在運行的內核等。不過,這些大多是不適合單元測試。
如果你想對這些東西進行單元測試,有兩種方法:
使用https://github.com/spf13/afero之類的東西抽象出整個文件系統層。
好處是您可以輕松測試代碼中幾乎所有與文件系統相關的內容。
使用變量抽象出一點代碼。
說吧,你可能有
var?whateverCreate?=?os.Create
在您的代碼中使用它
whateverCreate
,然后在測試套件的設置代碼中覆蓋該變量,為其分配一個函數,該函數返回您在特定測試中需要的任何錯誤。
- 3 回答
- 0 關注
- 255 瀏覽
添加回答
舉報