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 }
Vous pouvez définir votre propre interface MyInterface avec les méthodes souhaitées :
type MyInterface interface { DoSomething(i int) error DoSomethingElse() ([]int, error) }
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 }
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") } }
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 }
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!