Forum: PC-Programmierung Mocken von C++ Std Funktionen


von Herbert (Gast)


Lesenswert?

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

von nicht"Gast" (Gast)


Lesenswert?

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++.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

von Herbert (Gast)


Lesenswert?

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
}

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

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
Noch kein Account? Hier anmelden.