Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengejek Interaksi Sistem Fail dengan Berkesan untuk Ujian Unit dalam Go?

Bagaimana untuk Mengejek Interaksi Sistem Fail dengan Berkesan untuk Ujian Unit dalam Go?

DDD
DDDasal
2024-12-22 00:31:26782semak imbas

How to Effectively Mock Filesystem Interactions for Unit Testing in 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn