Monkey Patching in Go : une solution pour des bases de code immuables
Travailler avec des bases de code qui ne sont pas programmées pour les interfaces et qui sont fortement interconnectées peut présenter défis en matière de tests et d’analyse comparative. Dans de tels scénarios, les techniques de moquerie traditionnelles peuvent ne pas être applicables. Cependant, il existe une stratégie dans Go qui peut aider : le patching de singe.
Face à une situation similaire, l'approche suggérée consiste à créer une interface personnalisée en tant que wrapper autour du code non modifiable. Cela vous permet de vous moquer de méthodes spécifiques dans les tests tout en laissant le code d'origine intact.
Pour illustrer, considérons l'exemple suivant :
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() }
Dans ce scénario, Concrete est le code que vous ne pouvez pas modifier . En créant l'interface MyInterface et en intégrant la structure Concrete d'origine, vous gagnez la flexibilité de simuler ses méthodes dans les tests :
// Replace the embedded type with a mock in tests type MockConcrete struct { MyInterface } func (m *MockConcrete) DoSomething(i int) error { // Implement custom logic for mocking DoSomething }
Cette approche fournit un moyen de tester des fonctionnalités spécifiques sans modifier le code sous-jacent.
Alternativement, comme suggéré dans les commentaires, vous pouvez également intégrer directement le type souhaité au lieu de créer une interface distincte. Cela vous permet de moquer sélectivement uniquement les méthodes dont vous avez besoin :
type Concrete struct { *somepackage.Client }
Cette stratégie conserve la possibilité d'accéder aux méthodes non moquées directement sur le type intégré, offrant une plus grande flexibilité dans les tests.
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!