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++.
Bei den GNU-Tools get das z.B. mit --wrap http://sourceware.org/binutils/docs-2.28/ld/Options.html#index-g_t_002d_002dwrap_003d_0040var_007bsymbol_007d-283 Das setzt allerdings voraus, das die Funktion nicht z.B. als inline in einem Header steht, nicht vom Compiler ersetzt wurde (daher mit -fno-builtin compilieren) und External Linkage hat, damit der Linker ein Symbol zum Wrappen hat. Und bei C++ muss man natürlich den Mangled Name verwenden.
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!?
1 | void Output::Init() { |
2 | ofstream out; |
3 | |
4 | out.open("path"); |
5 | if (!out.is_open()) |
6 | return; |
7 | |
8 | out << "test"; |
9 | out.close(); |
10 | }
|
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 | > void Output::Init() { |
2 | > ofstream out; |
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 < class Stream > |
2 | class basic_output |
3 | {
|
4 | public:
|
5 | void init() |
6 | {
|
7 | Stream out; |
8 | ...;
|
9 | }
|
10 | };
|
11 | |
12 | using Output = 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
Beitrag #5137611 wurde von einem Moderator gelöscht.
Beitrag #5137917 wurde von einem Moderator gelöscht.
Beitrag #5137935 wurde von einem Moderator gelöscht.
Beitrag #5137979 wurde von einem Moderator gelöscht.
Beitrag #5137988 wurde vom Autor gelöscht.
Beitrag #5138082 wurde von einem Moderator gelöscht.
Beitrag #5138092 wurde von einem Moderator gelöscht.
Beitrag #5138354 wurde von einem Moderator gelöscht.
Beitrag #5138523 wurde von einem Moderator gelöscht.
Beitrag #5139161 wurde von einem Moderator gelöscht.
Beitrag #5139987 wurde von einem Moderator gelöscht.
Beitrag #5140010 wurde von einem Moderator gelöscht.
Beitrag #5140101 wurde von einem Moderator gelöscht.
Beitrag #5140243 wurde von einem Moderator gelöscht.
Beitrag #5140384 wurde von einem Moderator gelöscht.
Beitrag #5140406 wurde von einem Moderator gelöscht.
Beitrag #5142599 wurde von einem Moderator gelöscht.
Beitrag #5143773 wurde von einem Moderator gelöscht.
Beitrag #5144966 wurde von einem Moderator gelöscht.
Beitrag #5144998 wurde von einem Moderator gelöscht.
Beitrag #5145231 wurde von einem Moderator gelöscht.
Beitrag #5145940 wurde von einem Moderator gelöscht.
Beitrag #5145966 wurde von einem Moderator gelöscht.
Beitrag #5148074 wurde von einem Moderator gelöscht.
Beitrag #5149300 wurde von einem Moderator gelöscht.
Beitrag #5149363 wurde von einem Moderator gelöscht.
Beitrag #5149385 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.