簡體   English   中英

如何在 go 中模擬/抽象文件系統?

[英]How to mock/abstract filesystem in go?

我希望能夠記錄我的 go 應用程序向底層操作系統發出的每次寫入/讀取,並且(如果可能)將 FS 完全替換為僅駐留在內存中的 FS。

是否有可能? 如何? 也許有現成的解決方案?

這直接來自 Andrew Gerrand 的關於 Go 的你(可能)不知道10 件事

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) }

為此,您需要編寫代碼以獲取fileSystem參數(可能將其嵌入其他類型,或者讓nil表示默認文件系統)。

對於那些希望在測試期間解決模擬文件系統問題的人,請查看 @spf13 的 Afero 庫, https://github.com/spf13/afero 它完成了公認答案所做的一切,但提供了更好的文檔和示例。

您可以使用testing/fstest包:

package main
import "testing/fstest"

func main() {
   m := fstest.MapFS{
      "hello.txt": {
         Data: []byte("hello, world"),
      },
   }
   b, e := m.ReadFile("hello.txt")
   if e != nil {
      panic(e)
   }
   println(string(b) == "hello, world")
}

https://golang.org/pkg/testing/fstest

僅僅因為在谷歌搜索這個問題時這個問題彈出的頻率很高:

我不知道記錄讀取和寫入,但是對於僅駐留在內存中的文件系統,我發現了blang/vfs 我沒有在生產中使用過,它說它是 alpha 並且接口可能會改變。 需要您自擔風險使用它。

我想你可以實現它來記錄讀取和寫入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM