Monkey Patching dans Go
Dans le langage de programmation Go, la moquerie peut être difficile lorsqu'il s'agit de code qui n'est pas structuré autour d'interfaces. Lorsque les structures sont directement interconnectées et que l'injection de dépendances n'est pas présente, cela entrave la capacité de tester et de comparer efficacement sans modifier le code sous-jacent.
Une technique qui peut venir à l'esprit des langages de script comme Python est le patch singe, où les objets peuvent être modifiés au moment de l'exécution. Bien que Go ne dispose pas d'un mécanisme équivalent pour la modification directe d'objets, il existe des approches alternatives pour obtenir des résultats similaires.
Une stratégie courante consiste à créer votre propre interface en tant que wrapper autour des structures que vous souhaitez moquer. Cela vous permet d'implémenter le comportement souhaité dans les méthodes d'interface, tout en préservant la fonctionnalité d'origine dans la structure sous-jacente. Par exemple :
type MyInterface interface { DoSomething(i int) error DoSomethingElse() ([]int, error) } type Concrete struct { client *somepackage.Client } func (c *Concrete) DoSomething(i int) error { return c.client.DoSomething(i) } func (c *Concrete) DoSomethingElse() ([]int, error) { return c.client.DoSomethingElse() }
En implémentant MyInterface, vous pouvez désormais créer des implémentations simulées pour vos tests :
// MockMyInterface implements MyInterface for testing purposes type MockMyInterface struct { mockedDoSomethingError error mockedDoSomethingElseResult []int } func (m *MockMyInterface) DoSomething(i int) error { return m.mockedDoSomethingError } func (m *MockMyInterface) DoSomethingElse() ([]int, error) { return m.mockedDoSomethingElseResult, nil }
Une autre approche, suggérée par @elithrar dans les commentaires, consiste à intégrer le tapez que vous souhaitez vous moquer dans votre propre structure. Cela vous permet de vous moquer sélectivement uniquement des méthodes qui le nécessitent :
type Concrete struct { *somepackage.Client }
En intégrant le client, vous pouvez appeler directement des méthodes comme DoSomethingNotNeedingMocking sans les ajouter à l'interface ni créer de simulations pour elles.
Ces techniques offrent des alternatives viables aux correctifs singe pour tester et évaluer le code qui n'est pas structuré autour d'interfaces.
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!