モックを使用した Go でのファイルシステムの相互作用のテスト
ファイルシステムと相互作用する関数の単体テストを行う場合、ファイルシステムのモック化は有益です。その使用法を実証するために、ファイル システム操作をカプセル化するカスタム fileSystem インターフェイスを作成する、インターフェイス ベースのアプローチを調べてみましょう。
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 インターフェイスの模擬バージョンを作成できます。これにより、テスト中のファイル システム操作の動作を制御できます。
関数例:
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 中国語 Web サイトの他の関連記事を参照してください。