Un test de la fonction de sortie (stdout/stderr) à Passer des tests unitaires
J'ai une fonction simple, je veux tester:
func (t *Thing) print(min_verbosity int, message string) {
if t.verbosity >= minv {
fmt.Print(message)
}
}
Mais comment puis-je tester cette fonction envoie sur la sortie standard? Test::Sortie fait ce que je veux en Perl. Je sais que je pourrais écrire mes propres réutilisable à faire de même dans le jeu de Go (comme décrit ici):
orig = os.Stdout
r,w,_ = os.Pipe()
thing.print("Some message")
var buf bytes.Buffer
io.Copy(&buf, r)
w.Close()
os.Stdout = orig
if(buf.String() != "Some message") {
t.Error("Failure!")
}
Mais c'est beaucoup de travail supplémentaire pour chaque test. J'espère qu'il y a de plus standard, ou peut-être une abstraction de la bibliothèque pour gérer cela.
Vous devez vous connecter pour publier un commentaire.
Une chose à rappeler aussi, il n'y a rien qui vous empêche d'écrire des fonctions pour éviter le passe-partout.
Par exemple, j'ai une application en ligne de commande qui utilise
log
et j'ai écrit cette fonction:Ensuite utilisé comme ceci:
À l'aide de cette assertion de la bibliothèque: http://godoc.org/github.com/stretchr/testify/assert.
Vous pouvez faire une des deux choses. La première consiste à utiliser Exemples.
La seconde (et la plus appropriée OMI) est d'utiliser de faux fonctions de votre IO. Dans votre code, vous n':
Et dans vos tests:
Une autre option est d'utiliser
fmt.Fprintf
avec unio.Writer
qui estos.Stdout
dans le code de production, mais peut-être dire quebytes.Buffer
dans les tests.Vous pourriez envisager d'ajouter une instruction de retour à votre fonction pour renvoyer la chaîne qui est en fait imprimé.
Maintenant, votre test pourrait-il suffit de cocher la chaîne renvoyée à une chaîne attendue (plutôt que de l'imprimer). Peut-être un peu plus en ligne avec le Développement Piloté par les tests (TDD).
Et, dans votre code de production, rien ne devait changer, puisque vous n'avez pas à affecter la valeur de retour d'une fonction, si vous n'en avez pas besoin.