Maison >développement back-end >Golang >Comment puis-je simuler des fonctions externes dans Go pour les tests unitaires ?

Comment puis-je simuler des fonctions externes dans Go pour les tests unitaires ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-02 18:57:37246parcourir

How Can I Mock External Functions in Go for Unit Testing?

Se moquer des fonctions externes dans Go

Lorsque vous testez des fonctions qui reposent sur des packages externes, se moquer de ces fonctions externes peut être essentiel pour créer des fonctions isolées et fiables. essais. Prenons l'exemple suivant :

import x.y.z

func abc() {
    ...
    v := z.SomeFunc()
    ... 
}

Pouvons-nous nous moquer de z.SomeFunc() pour tester unitairement abc() ?

Solution : refactorisation et moquerie

Oui, se moquer de z.SomeFunc() est possible avec une simple refactorisation. Introduisez une variable zSomeFunc de type fonction et initialisez-la avec z.SomeFunc. Ensuite, dans votre fonction qui appelle z.SomeFunc(), invoquez plutôt zSomeFunc() :

var zSomeFunc = z.SomeFunc

func abc() {
    // ...
    v := zSomeFunc()
    // ...
}

Pendant les tests, attribuez une fonction personnalisée à zSomeFunc qui renvoie le comportement de test souhaité. Par exemple :

func TestAbc(t *testing.T) {
    // Save current function and restore at the end:
    old := zSomeFunc
    defer func() { zSomeFunc = old }()

    zSomeFunc = func() int {
        // This will be called, do whatever you want to,
        // return whatever you want to
        return 1
    }

    // Call the tested function
    abc()

    // Check expected behavior
}

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!

Déclaration:
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