Спасибо @Adrian:
По пути домой я понял, что это, вероятно, связано с созданием нового читателя каждый раз, когда вызывается метод.Удаление экземпляра читателя из моего ReadFunc работало отлично!
И спасибо @Thundercat за подсказку strings.NewReader()
, обновленный код:
reader := ioutil.NopCloser(strings.NewReader(consulPropertiesFile))
file := &mockFile{
ReadFunc: func(p []byte) (int, error) {
return reader.Read(p)
},
CloseFunc: func() error {
return nil
},
}
Для всех, кто ищет этот пост, ищетинформация о том, как макетировать файловую систему и т. д .:
Интерфейс для открытия и статистики файлов, а также конкретная реализация с использованием пакета os
:
// FileSystem - interface to the filesystem
type FileSystem interface {
Open(name string) (File, error)
Stat(name string) (os.FileInfo, error)
}
// OsFS - filesystem backed by default os package
type OsFS struct {
}
// Open - open a file
func (o *OsFS) Open(name string) (File, error) {
return os.Open(name)
}
// Stat - get file status
func (o *OsFS) Stat(name string) (os.FileInfo, error) {
return os.Stat(name)
}
Указанный выше интерфейс файла:
// File - file interface
type File interface {
io.Closer
io.Reader
io.ReaderAt
io.Seeker
Stat() (os.FileInfo, error)
}
Создайте макет файла, который вы хотите вернуть вашей файловой системе (реализуйте методы, которые будут использоваться вашим кодом):
type mockFile struct {
CloseFunc func() error
ReadFunc func(p []byte) (int, error)
ReadAtFunc func(p []byte, off int64) (int, error)
SeekFunc func(offset int64, whence int) (int64, error)
StatFunc func() (os.FileInfo, error)
}
func (m *mockFile) Close() error {
return m.CloseFunc()
}
func (m *mockFile) Read(p []byte) (int, error) {
return m.ReadFunc(p)
}
func (m *mockFile) ReadAt(p []byte, off int64) (int, error) {
return m.ReadAtFunc(p, off)
}
func (m *mockFile) Seek(offset int64, whence int) (int64, error) {
return m.SeekFunc(offset, whence)
}
func (m *mockFile) Stat() (os.FileInfo, error) {
return m.StatFunc()
}
---
reader := ioutil.NopCloser(strings.NewReader("some string, replace with bytes etc"))
file := &mockFile{
ReadFunc: func(p []byte) (int, error) {
return reader.Read(p)
},
CloseFunc: func() error {
return nil
},
}
И верните свой mockFile через mockFileSystem:
fs := &mockFileSystem{
OpenFunc: func(name string) (File, error) {
return file, nil
},
}