Mi piace la funzionalità del linker GNU per avvolgere molto le funzioni. Normalmente lo uso simulato ad es. chiamate non deterministiche chiamate come rand(). Si consideri il seguente esempio in cui mi piacerebbe scrivere un test unità per giveMeANumber:Wrapping delle funzioni C++ con il linker GNU
//number.cpp
int giveMeANumber() {
return rand() % 6 + 1;
}
posso avvolgere la chiamata a rand con la GNU involucro funzionalità linker in questo modo:
//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
C'è un modo fare lo stesso con le normali funzioni C++? Quello che segue non funziona, immagino sia a causa del nome di mangling. Ma anche quando provo con il nome storpiato non funziona.
//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
Qualche idea?
In realtà, rand è una funzione deterministica. Restituisce una sequenza numerica pseudo-casuale. Chiama il rand restituirà la stessa sequenza di numeri per ogni seme specificato utilizzato con srand. – TJD
Ok, bravo, è vero. Ma per mantenere l'esempio breve e leggibile, non ho usato un seme. – Mike
È necessario rinominare '__wrap_foo' in' getRandomNumber'. (http://xkcd.com/221/) –