3 回答

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

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

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