2015-03-25 1 views
1

J'essaie de tester une unité qui appelle d'autres fonctions du récepteur dans cette structure.Réception de fonctions du récepteur dans Go

Disons que je veux tester trois() et se moquer de l'appel à deux() dans les domaines suivants:

type MyStruct struct { 
    a string 
    b string 
} 

func (m *MyStruct) one() int { 
    return 2 
} 

func (m *MyStruct) two() int { 
    return m.one() * 2 
} 

func (m *MyStruct) Three() int { 
    return m.two() * 2 
} 

je méthode suivante deux des answer suivantes.

J'ai créé un constructeur personnalisé pour chaque fonction que je voulais tester et remplacer ces méthodes avec des versions simulées. Mais je pensais qu'il ne serait pas facile de maintenir le code une fois que le nombre de fonctions augmenterait.

Y a-t-il un moyen préféré de se moquer de ces fonctions? Je souhaite que la documentation officielle ait quelques directives sur la façon de se moquer des choses dans différents scénarios, similaire à ce que mox fournit sur Python.

Notez également que je ne souhaite pas utiliser une bibliothèque de simulation tierce.

+1

Pourquoi s'embêter? Je pense qu'un test unitaire par méthode est plus que suffisant. Pensez à un test unitaire sur la méthode "Trois" comme un mini test d'intégration. – jmaloney

+0

C'est exactement ce que j'essaie de faire. Je veux me moquer de tous ces appels, car je ne fais que tester la fonctionnalité d'une fonction particulière.La fonction "Trois" pourrait être n'importe quelle fonction ici. Ce n'est pas nécessairement un test intégré. – mohi666

+0

Pourquoi * Je ne souhaite pas utiliser une bibliothèque de simulation de tierce partie *? 'unittest.mock' était une bibliothèque tierce jusqu'à python3.2 et dans python2.7 vous devez toujours l'installer par' pip'. –

Répondre

4

C'est une façon vraiment non-idiomatique de tester votre matériel. Tout ce moqueur pourrait être nécessaire dans d'autres langues, mais s'il vous plaît ne le faites pas dans Go.

La façon naturelle de tester votre code dans l'exemple que vous avez donné serait: 1) une table essai moteur pour MyStruct.one et assurez-vous de tester tous les cas. Maintenant que vous savez one fonctionne parfaitement bien 2) faire la même chose avec MyStruct.two. Notez que le test de choses non exportées est possible, utile et commun dans Go. Maintenant, il n'y a plus besoin de se moquer certaines méthodes, juste 3) écrire un test conduit table pour MyStruct.Three et vérifiez cela fonctionne.

Mais peut-être vos méthodes one et two faire des choses plus fantaisistes, et l'accès l'environnement (système de fichiers, base de données, réseau) et vous ne voulez pas vos tests de Three dépendre de cela? Alors refactorisez votre code! Peut-être Three ne devrait pas être une méthode de MyStruct mais une fonction qui prend une interface OneAndTwoer comme argument et votre code de production appelle Three avec « vrais » MyStructs pendant que votre TestCode appelle avec InMemoryMyStrcuts qui ne dépendent pas de l'environnement? Vous pouvez l'appeler un faux, je l'appellerais une implémentation différente d'une interface.

Dans votre exemple, il est simple de donner des conseils: utiliser la table conduite essais pour one, two et Three et ne vous moquez pas. Pour un problème plus réaliste, le conseil peut être différent, mais il est difficile de donner un avis général sans connaître les circonstances . Le meilleur conseil général est: Jetez un oeil à l'essai dans la bibliothèque standard où vous trouverez des modèles utiles pour presque chaque scénario de test.