2013-03-23 8 views
5

Ich habe eine C-Funktion uint8_t command_read(const FILE* const in), die von in liest. Ich möchte einen Komponententest für die Funktion schreiben. Ist es möglich, einen FILE* im Speicher für den Test zu erstellen, da ich vermeiden möchte, mit dem Dateisystem interagieren zu müssen? Wenn nicht, was sind die Alternativen?Wie Unit-Test eine C-Funktion mit einem FILE * Argument

Antwort

9

Ist es möglich, eine FILE * im Speicher für den Test zu erstellen?

Sicher. Zum Schreiben:

char *buf; 
size_t sz; 
FILE *f = open_memstream(&buf, &sz); 

// do stuff with `f` 

fclose(f); 
// here you can access the contents of `f` using `buf` and `sz` 

free(buf); // when done 

Dies ist POSIX. Docs.

Zum Lesen:

char buf[] = "Hello world! This is not a file, it just pretends to be one."; 
FILE *f = fmemopen(buf, sizeof(buf), "r"); 
// read from `f`, then 
fclose(f); 

This is POSIX too.

Nebenbei bemerkt:

Ich möchte den Test vermeiden, die mit dem Dateisystem zu interagieren müssen.

Warum?

+2

"* Warum? *" - das ist die Art der Komponententests. Sie möchten ** Ihre Modulfunktionalität ** ohne Einbeziehung externer Faktoren testen. Aus diesem Grund werden externe Schnittstellen normalerweise durch Stubs oder ähnliches emuliert. – SomeWittyUsername

+1

@icepack Euh, ist das nicht unrealistisch? Ich meine, wenn es einen Fehler beim Öffnen einer Datei gibt, aber der Komponententest besteht ... –

+0

UT sollte alle möglichen Arten von Eingaben in das geprüfte Modul injizieren. Das Öffnen fehlgeschlagener Dateien kann problemlos emuliert werden, indem der Funktion ein NULL-Handler bereitgestellt wird. Das erwartete Verhalten sollte mit Fehler zurückgegeben oder bestätigt werden. – SomeWittyUsername

Verwandte Themen