亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 os.O_RDWR 和 os.O_CREATE 標志測試 file.Open?

如何使用 os.O_RDWR 和 os.O_CREATE 標志測試 file.Open?

Go
慕絲7291255 2023-07-17 14:04:06
我正在嘗試為結構構造函數編寫單元測試,如果在 file.Open 期間發生錯誤,它也可能返回 nil。我不知道如何使用標志測試/模擬文件錯誤: os.O_RDWR|os.O_CREATE|os.O_APPEND我嘗試檢查測試中的 nil 值,但失敗了。構造函數:type App struct {    someField string    log *log.Logger}func New() *App {    app := &App{}    f, err := os.OpenFile("info.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)    if err != nil {        fmt.Printf("error opening file: %v", err)        return nil    }    mw := io.MultiWriter(os.Stdout, f)    l = log.New(mw, "APP", log.Ldate|log.LstdFlags|log.Lshortfile)    app.log = l    return app}并測試構造函數:func TestNew(t *testing.T) {    var a App    a = New()    // doesn't cover    if a == nil {        t.Fatal("Error opening file")    }}我希望覆蓋錯誤!= nil,它在覆蓋范圍內是紅色的:f, err := os.OpenFile("info.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)if err != nil {  fmt.Printf("error opening file: %v", err)  return nil}
查看完整描述

3 回答

?
繁華開滿天機

TA貢獻1816條經驗 獲得超4個贊

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



查看完整回答
反對 回復 2023-07-17
?
FFIVE

TA貢獻1797條經驗 獲得超6個贊

您可以使文件名/文件路徑可配置,而不是使用硬編碼的 info.log,然后在您的測試中您可以使用一些不存在的路徑。

有多種配置選項:

  • 構造函數中的參數(如果您想保持 API 不變,也許可以從 New 調用一個單獨的構造函數)

  • 包級別配置(如全局變量 defaultLogFileName),這不太靈活(例如,如果您想并行運行測試),但也可能適合這種情況


查看完整回答
反對 回復 2023-07-17
?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

有兩件事需要考慮。

第一個是O_RDWR|O_CREAT|O_APPEND在打開文件時幾乎沒有什么有趣的:它告訴操作系統應該以附加模式打開文件以進行讀寫,并且如果文件在調用時不存在,則應該被創建,否則可以追加到它上面。

現在我認為此操作可能失敗的唯一兩個原因是:

  • 包含該文件的文件系統被掛載為只讀 - 因此打開文件進行寫入、創建文件并附加到文件是不可能的。

  • 該文件不存在,并且文件系統的索引節點表已滿,因此即使有空間用于該文件的數據,也無法為另一個文件創建記錄。

現在考慮一下,為了模擬其中一種情況,您需要操作運行測試的進程可用的一些文件系統。雖然它當然可以在單元測試框架內完成,但它看起來更屬于集成測試領域。

在 Linux 上進行這一級別的測試有很多選擇:“flakey”設備映射器目標和朋友,通過循環設備或 FUSE 安裝只讀映像,將故障注入正在運行的內核等。不過,這些大多是不適合單元測試。

如果你想對這些東西進行單元測試,有兩種方法:

  • 使用https://github.com/spf13/afero之類的東西抽象出整個文件系統層。

    好處是您可以輕松測試代碼中幾乎所有與文件系統相關的內容。

  • 使用變量抽象出一點代碼。

    說吧,你可能有

    var?whateverCreate?=?os.Create

    在您的代碼中使用它whateverCreate,然后在測試套件的設置代碼中覆蓋該變量,為其分配一個函數,該函數返回您在特定測試中需要的任何錯誤。


查看完整回答
反對 回復 2023-07-17
  • 3 回答
  • 0 關注
  • 255 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號