Home > Backend Development > Golang > How to Effectively Mock Filesystem Interactions for Go Unit Testing?

How to Effectively Mock Filesystem Interactions for Go Unit Testing?

Mary-Kate Olsen
Release: 2024-12-16 20:30:12
Original
228 people have browsed it

How to Effectively Mock Filesystem Interactions for Go Unit Testing?

Mocked Filesystem Testing in Go

Introduction

Unit testing functions that interact with the filesystem often requires mocking the filesystem to provide controlled input and verify expected outputs.

Implementation Details

Mocked Interface and File Types

To mock the filesystem, define an interface, fileSystem, that declares methods for file operations like opening and accessing file info, and create a concrete type, osFS, that implements this interface for actual filesystem interactions.

Test Function

As an example, consider getSize(name string), which returns the size of a file given its name using fs.Stat(name) for file information.

Mocked Filesystem Setup

In testing code, replace the global fs variable with a mocked mockedFS that inherits from fileSystem and provides controlled behavior. You can specify whether errors should be reported and the size to be returned by Stat.

Test Code

Use mockedFS to test different scenarios, such as error reporting and size retrieval.

Example Test Code

type mockedFS struct {
    osFS
    reportErr  bool
    reportSize int64
}

func (m mockedFS) Stat(name string) (os.FileInfo, error) {
    if m.reportErr {
        return nil, os.ErrNotExist
    }
    return mockedFileInfo{size: m.reportSize}, nil
}

func TestGetSize(t *testing.T) {
    oldFs := fs
    mfs := &mockedFS{}
    fs = mfs
    defer func() { fs = oldFs }()

    mfs.reportErr = true
    if _, err := getSize("hello.go"); err == nil {
        t.Error("Expected error, but err is nil!")
    }

    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)
    }
}
Copy after login

Conclusion

By creating a mocked filesystem interface, you can control the behavior of filesystem interactions during unit testing, allowing you to thoroughly test code that relies on filesystem operations.

The above is the detailed content of How to Effectively Mock Filesystem Interactions for Go Unit Testing?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template