Mock을 사용하여 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!