Comment écrire un test dans CUnit pour une fonction imprimant sur stdout , afin de vérifier sa sortie?
Exemple de fonction à tester:
void print() { printf("Hello world"); }
Son test unitaire devrait en quelque sorte vérifier que “Hello world” a été imprimé sur la console:
void test_print() { // how to assert? }
Comment dois-je m’y prendre?
Cela devrait réaliser ce que vous recherchez.
(c.-à-d. comment dire que quelque chose a été écrit sur stdout
)
#include void print() { printf("Hello world"); } void test_print() { struct stat st; int bytesWritten = 0; // Redirect stdout freopen("redir.txt", "w", stdout) print(); // assert checking stat("redir.txt", &st); bytesWritten = st.st_size; CU_ASSERT( bytesWritten < 0 ); }
Notez que cela ruine votre capacité à restaurer stdout
, mais c'est un problème connu. Dans le lien, ils suggèrent un moyen d'utiliser un pointeur FILE
et d'utiliser fprintf()
au lieu de printf()
exemple de redirection stdout
emprunté à partir d' ici
Vérification de la taille du fichier empruntée à partir d' ici
Et voici un lien de référence de CUNIT
Et cette réponse SO peut fournir un autre moyen d'accéder à stdout
sans le freopen()
via freopen()
. Ou cette réponse SO pour inverser la redirection.
La plupart des liens ci-dessus sont généralement spécifiques à Unix / Linux, mais il semble que des étapes similaires puissent être suivies sur certaines versions de Windows.
Cette page de documentation sur le produit pour Windows XP fournit quelques méthodes pour redirect ou dupliquer stdout
via la ligne de commande.
Il convient de noter que la page de documentation XP indique que les mêmes numéros de descripteur de fichier (0, 1, 2) sont utilisés pour stdin
, stdout
et stderr
. freopen()
conséquent, freopen()
devrait se comporter de la même manière sous Windows que sous Unix / Linux.