Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengejek Interaksi Sistem Fail dengan Berkesan untuk Ujian Unit dalam Go?
Menguji Interaksi Sistem Fail dalam Go dengan Mocks
Mengejek sistem fail boleh menjadi berharga apabila unit menguji fungsi yang berinteraksi dengan sistem fail. Untuk menunjukkan penggunaannya, mari kita periksa pendekatan berasaskan antara muka, di mana kita mencipta antara muka sistem fail tersuai yang merangkum operasi sistem fail.
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) }
Pelaksanaan Mock:
Untuk mengejek sistem fail, kami boleh mencipta versi olok-olok antara muka FileSystem, dipanggil mockedFS. Ini membolehkan kami mengawal kelakuan operasi sistem fail semasa ujian.
Contoh Fungsi:
Mari kita pertimbangkan fungsi getSize yang mengembalikan saiz fail menggunakan sistem fail.Stat kaedah:
func getSize(name string) (int64, error) { stat, err := fs.Stat(name) if err != nil { return 0, err } return stat.Size(), nil }
Menyediakan Olok-olok:
Sebelum menguji getSize, kita perlu menggantikan pembolehubah fs global dengan contoh ejek kami:
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 }() }
Pelaksanaan Ujian:
Kod ujian di bawah mengesahkan kelakuan fungsi getSize di bawah pelbagai ralat dan saiz fail syarat:
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"); ... }
Contoh ini menunjukkan cara mencipta antara muka sistem fail tersuai, mengejek pelaksanaannya dan menggunakannya untuk menguji fungsi yang berinteraksi dengan sistem fail, memastikan persekitaran ujian terkawal dalam Go.
Atas ialah kandungan terperinci Bagaimana untuk Mengejek Interaksi Sistem Fail dengan Berkesan untuk Ujian Unit dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!