Go でのファイルシステムの相互作用の単体テスト: 実践例
単体テストは、ファイルシステムと相互作用するコードの堅牢性を確保するために重要です。 Go では、カスタム インターフェイスを作成し、テスト目的でファイル システムをモックすることができます。以下では、このテクニックを効果的に使用する方法を示します。
ファイルシステムのモック
ファイルシステムをモックする鍵は、提供されているようなインターフェイスを作成することにあります。最初のコード スニペット:
type fileSystem interface { Open(name string) (file, error) Stat(name string) (os.FileInfo, error) }
このインターフェイスはファイル システム呼び出しを抽象化し、実際のファイル システムに影響を与えることなくそれらを模擬できるようにします。
単体テストの関数例
ファイルシステムと対話する関数をテストするには、ファイルのサイズを返す単純な関数を作成しましょう。
func getSize(name string) (int64, error) { stat, err := fs.Stat(name) if err != nil { return 0, err } return stat.Size(), nil }
嘲笑されましたファイルシステム
テスト用にファイル システムをモックするために、fileSystem インターフェイスを実装する模擬 FS を作成します。
type mockedFS struct { reportErr bool // Controls error reporting in tests reportSize int64 // Controls size reporting in tests }
この模擬 FS を使用すると、テスト中にファイル システムの動作をシミュレートできます。
モックのセットアップファイルシステム
テストを実行する前に、モックされたファイルシステムをインストールする必要があります。
oldFs := fs fs = &mockedFS{}
単体テストの実装
ここで、 getSize() を完全にカバーする単体テストを作成できるfunction:
func TestGetSize(t *testing.T) { oldFs := fs mfs := &mockedFS{} fs = mfs defer func() { fs = oldFs }() // Test error case mfs.reportErr = true if _, err := getSize("hello.go"); err == nil { t.Error("Expected error, but err is nil!") } // Test successful case 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) } }
このテストでは、エラーと成功の両方のケースをシミュレートし、getSize() 関数を完全にカバーしていることを確認します。
これらの手順に従うことで、効果的にモックすることができます。ファイルシステムを作成し、Go でファイルシステムと対話するコードを徹底的に検証する単体テストを作成します。この手法により、コードの正しさに対する信頼が得られ、アプリケーションの全体的な品質が向上します。
以上がGo でファイルシステムの相互作用を効果的に単体テストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。