Hi
Ich bin derzeit dabei ein c++ Projekt mit Unit Tests auszustatten. Dabei
verwendet das Projekt C Bibliotheken wo ich die Funktionen mit dem fff
Framework ersetze wodurch ich den Rückgabewert zum Beispiel von popen
einstellen kann usw. Nun habe ich aber das Problem das in den Funktionen
die ich testen will auch aufrufe von fstream::open vorkommen. Für diese
Aufrufe von c++ Funktionen würde ich auch gerne FakeFunktionen schreiben
damit ich alles testen kann. Leider habe ich bisher nichts dazu gefunden
was funktioniert hat. Daher meine Frage ob ihr eine Tipp habt wie ich
das realisieren kann?! Danke im Vorhinein für eure Antworten.
mfg Herbert
Hallo, wieder was gelernt, das fff kannte ich noch gar nicht.
Für C++ kann ich dir jedoch raten, nimm was anderes. Das fff ist eine
Sammlung von Makros und das sollte man nicht für C++ verwenden. Ist der
Horror zu debuggen, wenn mal was nicht laufen sollte.
Benutze lieber ein passendes, dann kannst du den C Kram sicher auch mit
testen.
Schau dir doch mal CppUnit an. Das ist ein ziemlich gägniges für C++.
Hi
Ich habe nun noch mehr recherchiert und ich finde keine vernünftige
Lösung. Beim fff Framework kann ich angeben welchen Rückgabewert die
Funktion beim nächsten Aufruf zurückgeben soll usw. Das habe ich bisher
für die C++ STD Funktionen noch nicht gefunden. Ich will eine selber
geschriebene Funktion testen welche intern eine Systemdatei öffnet mir
ofstream und dann etwas schreibt. Nun würde ich gerne ofstream mocken
damit ich bestimmen kann welchen Rückgabewert is_open() liefert usw. Mit
gMock müsste ich aber den verwendeten Stream meiner Funktion übergeben
damit ich die Möglichkeit habe einen fake Stream zu übergeben. Gibt es
da noch eine Möglichkeit oder ist das einfach nicht möglich beim unit
test!?
Herbert schrieb:> Ich will eine selber> geschriebene Funktion testen welche intern eine Systemdatei öffnet mir> ofstream und dann etwas schreibt. Nun würde ich gerne ofstream mocken> damit ich bestimmen kann welchen Rückgabewert is_open() liefert usw.>>
1
>voidOutput::Init(){
2
>ofstreamout;
3
>
4
>out.open("path");
5
>if(!out.is_open())
6
>return;
7
>
8
>out<<"test";
9
>out.close();
10
>}
11
>
Ich würde entweder aus Output ein template machen und ostream als
Parameter mitgeben. Vielleicht so:
1
template<classStream>
2
classbasic_output
3
{
4
public:
5
voidinit()
6
{
7
Streamout;
8
...;
9
}
10
};
11
12
usingOutput=basic_output<std::ofstream>;
Und die Tests dann entsprechend gegen basic_output schreiben.
Oder ganz pragmatisch, im setup zum Test die zu öffnende Datei
erstellen, wenn das öffnen funktionieren soll. Bzw. die Datei löschen,
wenn das Öffnen fehlschlagen soll.
Oder ggf. das Design von Output so ändern, dass es eine Referenz auf
einen ostream als c'tor Argument nimmt. Kommt halt etwas darauf an, was
Outputs responsibilities sind.
mfg Torsten