使用Mock 測試Go 中的檔案系統互動
在對與檔案系統互動的函數進行單元測試時,模擬檔案系統非常有價值。為了示範其用法,讓我們檢查基於介面的方法,在該方法中我們建立一個封裝檔案系統操作的自訂檔案系統介面。
var fs fileSystem = osFS{} type fileSystem interface { Open(name string) (file, error) Stat(name string) (os.FileInfo, error) } type file interface { io.Closer io.Reader io.ReaderAt io.Seeker Stat() (os.FileInfo, error) } // osFS implements fileSystem using the local disk. type osFS struct{} func (osFS) Open(name string) (file, error) { return os.Open(name) } func (osFS) Stat(name string) (os.FileInfo, error) { return os.Stat(name) }
模擬實作:
為了模擬檔案系統,我們可以建立檔案系統介面的模擬版本,稱為mockedFS。這使我們能夠在測試期間控製檔案系統操作的行為。
範例函數:
讓我們考慮一個使用filesystem.Stat 傳回檔案大小的函數getSize方法:
func getSize(name string) (int64, error) { stat, err := fs.Stat(name) if err != nil { return 0, err } return stat.Size(), nil }
設定模擬:
測試getSize之前,我們需要將全域 fs 變數替換為我們的模擬實例:
func TestGetSize(t *testing.T) { // Save the original filesystem oldFs := fs // Replace with mocked filesystem mfs := &mockedFS{} fs = mfs // Restore original filesystem after test defer func() { fs = oldFs }() }
測試執行:
下面的測試程式碼驗證了 getSize函數在各種錯誤和檔案大小下的行為條件:
type mockedFS struct { reportErr bool reportSize int64 } func (mfs) Stat(name string) (os.FileInfo, error) { if mfs.reportErr { return nil, os.ErrNotExist } return &mockedFileInfo{size: mfs.reportSize}, nil } type mockedFileInfo struct { size int64 } func (mfi mockedFileInfo) Size() int64 { return mfi.size } // Test Error Case func TestGetSize(t *testing.T) { ... mfs.reportErr = true if _, err := getSize("hello.go"); err == nil { ... } // Test Non-Error Case func TestGetSize(t *testing.T) { ... mfs.reportSize = 123 if size, err := getSize("hello.go"); ... }
此範例示範如何建立自訂檔案系統接口,模擬其實現,並使用它來測試與檔案系統互動的函數,確保Go 中的受控測試環境。
以上是如何在 Go 中有效模擬檔案系統互動以進行單元測試?的詳細內容。更多資訊請關注PHP中文網其他相關文章!