Maison > développement back-end > Golang > Comment puis-je obtenir un comportement de type Monkey Patching dans Go pour des tests plus faciles ?

Comment puis-je obtenir un comportement de type Monkey Patching dans Go pour des tests plus faciles ?

DDD
Libérer: 2024-12-08 17:19:10
original
629 Les gens l'ont consulté

How Can I Achieve Monkey Patching-like Behavior in Go for Easier Testing?

Monkey Patching dans Go : un moyen de modifier des objets au moment de l'exécution

Dans Go, lorsque vous travaillez avec une base de code fortement interconnectée qui manque d'interfaces ou l'injection de dépendances, les tests ou l'analyse comparative peuvent devenir difficiles en raison de l'incapacité de simuler ou d'échanger des composants. Cependant, il existe des techniques qui ressemblent au patch singe dans des langages de script comme Python, vous permettant de modifier des objets au moment de l'exécution dans Go.

Une approche consiste à créer une interface personnalisée qui enveloppe l'objet d'origine et permet de se moquer des tests. . Par exemple, si vous avez une structure nommée Concrete qui dépend d'un package appelé somepackage :

type Concrete struct {
    client *somepackage.Client
}
Copier après la connexion

Vous pouvez définir votre propre interface MyInterface avec les méthodes souhaitées :

type MyInterface interface {
    DoSomething(i int) error
    DoSomethingElse() ([]int, error)
}
Copier après la connexion

Ensuite, implémenter cette interface dans un objet fictif :

type MockConcrete struct {
    DoSomethingCalled bool
    DoSomethingElseCalled bool
}

func (m *MockConcrete) DoSomething(i int) error {
    m.DoSomethingCalled = true
    return nil
}

func (m *MockConcrete) DoSomethingElse() ([]int, error) {
    m.DoSomethingElseCalled = true
    return []int{}, nil
}
Copier après la connexion

Dans vos tests, vous pouvez injecter l'objet fictif dans Concrete et vérifier son behavior :

func TestDoSomething(t *testing.T) {
    mockConcrete := &MockConcrete{}
    c := &Concrete{client: mockConcrete}

    c.DoSomething(42)

    if !mockConcrete.DoSomethingCalled {
        t.Error("DoSomething was not called")
    }
}
Copier après la connexion

Une autre technique consiste à intégrer le type dont vous souhaitez vous moquer dans votre propre structure. Cela vous permet de remplacer les méthodes souhaitées pour vous moquer tout en conservant l'accès aux autres méthodes de l'objet d'origine. Par exemple :

type Concrete struct {
    *somepackage.Client
}
Copier après la connexion

Avec cette approche, vous pouvez appeler directement des méthodes non remplacées comme DoSomethingNotNeedingMocking sur Concrete sans avoir à les simuler.

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