Comment tester une fonction non exportée (privée) dans go (golang)?

J'étais intéressé à créer un test unitaire pour les "fonctions (privées) non exportées" dans go. Cependant, il est fondamentalement très difficile de créer des tests unitaires dans le package de test parce que je dois les rendre "publics". Ce qui à la fin, défait tout le point d'être privé. Le fait est que ces fonctions d'aide aident à modulariser et maintenant qu'elles sont modulaires, il serait bon de pouvoir créer des tests unitaires pour eux sans les rendre disponibles à tout le monde sauf le paquet de test, nice ce ne sont pas des fonctions qui devraient être accessibles ou utilisées par quelqu'un d'autre sauf la suite de tests ou le paquet lui-même.

Des suggestions? Est-il possible de seulement exporter vers son propre paquet et 1 paquet supplémentaire ou quelque chose de ce genre dans go?

30
demandé sur Charlie Parker 2014-07-08 05:30:23

2 réponses

Créer un fichier de test dans le package

Library_test.aller

package mypkg

func TestPrivateStruct(t *testing.T){
  pf := private{ "Private Field" }
  ....
}

Bibliothèque.aller

package mypkg

type private struct {
  privateField string
}

go test mypkg -v exécutera vos Tests avec votre structure privée

37
répondu fabrizioM 2014-07-08 01:35:54

Tout d'abord, vous pouvez avoir les deux types de tests dans le même emplacement que votre paquet en utilisant le nom du paquet pour les tests internes (par exemple mypkg) et en utilisant le même nom de paquet avec "_test" ajouté pour les tests "externes" (par exemple mypkg_test). Les deux types de tests doivent être dans des fichiers dont le nom se termine par " _test.aller".

Mais, tout le but des tests unitaires est de tester l '"interface externe" (c'est-à-dire les fonctions publiques) sur votre paquet. C'est les tests unitaires doivent toujours être "boîte blanche" tests (voir Test de la boîte blanche ). De cette façon, vous pouvez refactoriser votre code et vos tests ne se casseront pas.

Bien sûr, parfois vous voulez vérifier la cohérence interne, ce qui n'est pas possible via "l'interface externe". Pour cela, j'ai trouvé des affirmations inestimables. Une autre possibilité serait d'ajouter des fonctions "diagnostiques" publiques avec des noms qui indiquent qu'elles ne sont pas destinées à un usage normal.

4
répondu Andrew W. Phillips 2017-06-01 00:12:28