Ich lese mehrere Artikel über Mocking C-Funktionen (wie CMock oder CMocka), aber ich bin mir nicht sicher, wie die tatsächlichen Funktionen durch mokierte Funktionen in diesem Prozess ersetzt werden. Zum Beispiel beruht CMocka auf automatischem Wrapping mit einem GNU-Compiler, der Parameter wie --wrap
unterstützt, um das Präfix __wrap
an Funktionsaufrufe anzuhängen, oder schwache Symbole, mit denen Sie jedes beliebige Symbol überschreiben können.Mocking C-Funktionen in MSVC (Visual Studio)
Aber wie macht man das in Visual Studio, für so ziemlich alle anderen Frameworks?
Zum Beispiel CMock has an example diesem ähnlich ist (vereinfacht viel hier):
// myfunc.c
#include <parsestuff.h>
// this is the function we would like to test
int MyFunc(char* Command)
{
// this is the call to the function we will mock
return ParseStuff(Command);
}
Es gibt auch die tatsächliche Umsetzung, die die eigentliche Funktion enthält der Linker in der tatsächlichen Anwendung finden sollte:
// parsestuff.c
int ParseStuff(char* cmd)
{
// do some actual work
return 42;
}
Jetzt
, während die Prüfung der Ruby-Skript erstellt Mock-Funktionen wie:
// MockParseStuff.c (auto created by cmock)
int ParseStuff(char* Cmd);
void ParseStuff_ExpectAndReturn(char* Cmd, int toReturn);
Wenn das VS-Projekt bereits
parsestuff.c
enthält, wie wird es dann möglich sein, dass der Anruf vonmyfunc.c
inMockParseStuff.c
endet?Bedeutet das, dass ich nicht
parsestuff.c
im Unit-Test-Projekt enthalten kann? Aber wenn das der Fall ist, dann ist es auch unmöglich, zum BeispielMyFunc
vonmyfunc.c
in irgendwelchen Tests zu verspotten, da ich bereits die Datei es einschließen musste, um es zu prüfen?
(Update) Ich bin mir auch bewusst, dass ich die .c
Datei anstelle der .h
Datei enthalten kann, und dann einige Präprozessor Sachen tun, um den ursprünglichen Anruf zu ersetzen, wie:
// replace ParseStuff with ParseStuff_wrap
#define ParseStuff ParseStuff_wrap
// include the source instead of the header
#include <myfunc.c>
#undef ParseStuff
int ParseStuff_wrap(char* cmd)
{
// this will get called from MyFunc,
// which is now statically included
}
aber das scheint eine Menge Klempnerei zu sein, und ich sehe es nirgendwo erwähnt.
[Diese Frage] (http://StackOverflow.com/q/33790425/1488067) fragte die spezifische Sache über das Konfigurieren des Linkers, um die Funktionen zu umhüllen, aber ich glaube, dass es in MSVC nicht möglich ist. Auch CMocka erwähnt dies, aber CMock erwähnt diese Anforderung überhaupt nicht. – Lou
Müssen Sie C-Style-Funktionen in einer C++ - Umgebung vortäuschen oder haben Sie nur C-Umgebung? Wenn Sie C++ verwenden können, gibt es eine sehr einfache Lösung für Ihr Problem, und ich kann ein Beispiel geben. – mrAtari
@mrAtari: es ist Visual Studio, also kann ich C++ und C mischen, aber es könnte Probleme mit bestimmten C-Code geben, der nicht mit C++ kompatibel ist ([ähnliche Frage] (http://softwarerecs.stackexchange.com/q/) 34878/22983), zum Beispiel). Wenn es jedoch die meiste Zeit funktioniert, stellen Sie bitte trotzdem ein Beispiel vor, wie C++ das Problem lösen könnte - insbesondere, wenn Sie vermeiden können, dass testbedingte Präprozessordirektiven in den Produktionscode eingefügt werden. – Lou