Bardzo podobają mi się funkcje łącznika GNU, aby znacznie zawijać funkcje. Zwykle używam tego fałszywego, np. niedeterministyczne wywołania funkcji, takie jak rand(). Rozważmy następujący przykład, w którym chciałbym napisać badanej jednostki dla giveMeANumber:Zawijanie funkcji C++ za pomocą łącznika GNU
//number.cpp
int giveMeANumber() {
return rand() % 6 + 1;
}
mogę zawinąć wywołanie rand z GNU funkcji łącznika owinąć jak ten:
//test.cpp
extern "C" int __wrap_rand(void) {
return 4;
}
void unitTest() {
assert giveMeANumber() == 5;
}
$ g++ test.cpp -o test number.o -Xlinker --wrap=rand
Czy istnieje jakiś sposób, zrobić to samo z normalnymi funkcjami C++? Następujące nie działa, myślę, że to z powodu manglingu nazwy. Ale nawet kiedy próbuję tego z zawikłaną nazwą, to nie działa.
//number.cpp
int foo() {
//some complex calculations I would like to mock
}
int giveMeANumber() {
return foo() % 6 + 1;
}
//test.cpp
extern "C" int __wrap_foo(void) {
return 4;
}
$ g++ test.cpp -o test number.o -Xlinker --wrap=foo
Jakieś pomysły?
W rzeczywistości rand jest funkcją deterministyczną. Zwraca sekwencję liczb pseudolosowych. Wywołania randu zwrócą tę samą sekwencję liczb dla dowolnego materiału siewnego użytego w srand. – TJD
Okay, bravo, to prawda. Ale żeby przykład był krótki i czytelny, nie użyłem nasion. – Mike
Musisz zmienić nazwę '__wrap_foo' na' getRandomNumber'. (http://xkcd.com/221/) –