Maison > développement back-end > Golang > Comment simuler efficacement les interactions du système de fichiers pour les tests unitaires en Go ?

Comment simuler efficacement les interactions du système de fichiers pour les tests unitaires en Go ?

DDD
Libérer: 2024-12-22 00:31:26
original
787 Les gens l'ont consulté

How to Effectively Mock Filesystem Interactions for Unit Testing in Go?

Test de l'interaction du système de fichiers dans Go avec des simulations

Se moquer du système de fichiers peut être utile lors des tests unitaires de fonctions qui interagissent avec le système de fichiers. Pour démontrer son utilisation, examinons une approche basée sur une interface, dans laquelle nous créons une interface fileSystem personnalisée qui encapsule les opérations du système de fichiers.

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) }
Copier après la connexion

Implémentation simulée :

Pour simuler le système de fichiers, nous pouvons créer une version simulée de l'interface fileSystem, appelée mockedFS. Cela nous permet de contrôler le comportement des opérations du système de fichiers pendant les tests.

Exemple de fonction :

Considérons une fonction getSize qui renvoie la taille du fichier à l'aide de filesystem.Stat méthode :

func getSize(name string) (int64, error) {
    stat, err := fs.Stat(name)
    if err != nil {
        return 0, err
    }
    return stat.Size(), nil
}
Copier après la connexion

Configuration du Mock :

Avant de tester getSize, nous devons remplacer la variable globale fs par notre instance simulée :

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 }()
}
Copier après la connexion

Exécution du test :

Le code de test ci-dessous vérifie le comportement de la fonction getSize sous diverses erreurs et tailles de fichier conditions :

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"); ... }
Copier après la connexion

Cet exemple montre comment créer une interface de système de fichiers personnalisée, simuler son implémentation et l'utiliser pour tester une fonction qui interagit avec le système de fichiers, garantissant ainsi un environnement de test contrôlé dans Go.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal