【发布时间】:2021-10-21 01:49:09
【问题描述】:
我希望能够将我的 go 应用程序发出的每次写入/读取记录到底层操作系统,并且(如果可能的话)将 FS 完全替换为仅驻留在内存中的 FS。
有可能吗?如何?也许有现成的解决方案?
【问题讨论】:
标签: filesystems mocking go
我希望能够将我的 go 应用程序发出的每次写入/读取记录到底层操作系统,并且(如果可能的话)将 FS 完全替换为仅驻留在内存中的 FS。
有可能吗?如何?也许有现成的解决方案?
【问题讨论】:
标签: filesystems mocking go
这直接来自 Andrew Gerrand 的10 things you (probably) don't know about 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) }
为此,您需要编写代码以采用fileSystem 参数(可能将其嵌入到其他类型中,或者让nil 表示默认文件系统)。
【讨论】:
os.Open 呢?分配fs 变量会“默默地”影响它们吗?
对于那些希望在测试期间解决模拟文件系统问题的人,请查看 @spf13 的 Afero 库 https://github.com/spf13/afero。它完成了公认答案所做的一切,但具有更好的文档和示例。
【讨论】:
io/fs 的替代品。 github.com/spf13/afero/issues/325
您可以使用testing/fstest 包:
package main
import "testing/fstest"
func main() {
fs := fstest.MapFS{
"hello.txt": {
Data: []byte("hello, world"),
},
}
data, err := fs.ReadFile("hello.txt")
if err != nil {
panic(err)
}
println(string(data) == "hello, world")
}
【讨论】:
fstest.MapFS{"tmp": {Mode: fs.ModeDir}}.
仅仅因为这个问题在谷歌上搜索这个问题时弹出的频率很高:
我不知道记录读取和写入,但对于仅驻留在内存中的文件系统,我找到了blang/vfs。我没有在生产中使用过,它说它是 alpha 并且接口可能会改变。需要您自担风险使用它。
我想你可以实现它来记录读取和写入。
【讨论】: