Unit testing functions that interact with the filesystem often requires mocking the filesystem to provide controlled input and verify expected outputs.
To mock the filesystem, define an interface, fileSystem, that declares methods for file operations like opening and accessing file info, and create a concrete type, osFS, that implements this interface for actual filesystem interactions.
As an example, consider getSize(name string), which returns the size of a file given its name using fs.Stat(name) for file information.
In testing code, replace the global fs variable with a mocked mockedFS that inherits from fileSystem and provides controlled behavior. You can specify whether errors should be reported and the size to be returned by Stat.
Use mockedFS to test different scenarios, such as error reporting and size retrieval.
type mockedFS struct { osFS reportErr bool reportSize int64 } func (m mockedFS) Stat(name string) (os.FileInfo, error) { if m.reportErr { return nil, os.ErrNotExist } return mockedFileInfo{size: m.reportSize}, nil } func TestGetSize(t *testing.T) { oldFs := fs mfs := &mockedFS{} fs = mfs defer func() { fs = oldFs }() mfs.reportErr = true if _, err := getSize("hello.go"); err == nil { t.Error("Expected error, but err is nil!") } mfs.reportErr = false mfs.reportSize = 123 if size, err := getSize("hello.go"); err != nil { t.Errorf("Expected no error, got: %v", err) } else if size != 123 { t.Errorf("Expected size %d, got: %d", 123, size) } }
By creating a mocked filesystem interface, you can control the behavior of filesystem interactions during unit testing, allowing you to thoroughly test code that relies on filesystem operations.
The above is the detailed content of How to Effectively Mock Filesystem Interactions for Go Unit Testing?. For more information, please follow other related articles on the PHP Chinese website!