Me gusta la funcionalidad del enlazador GNU para ajustar funciones mucho. Normalmente lo uso simulacro, p. funciones no deterministas llamadas como rand(). Considere el siguiente ejemplo en el que me gustaría escribir una prueba unitaria para giveMeANumber:Envoltura de funciones C++ con el enlazador GNU
//number.cpp
int giveMeANumber() {
return rand() % 6 + 1;
}
puedo envolver la llamada a rand con la GNU funcionalidad enlazador envoltura de la siguiente manera:
//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
¿Hay alguna manera hacer lo mismo con las funciones normales de C++? Lo siguiente no funciona, supongo que es debido al cambio de nombre. Pero incluso cuando lo intento con el nombre destrozado, no funciona.
//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
¿Alguna idea?
En realidad, rand es una función determinista. Devuelve una secuencia numérica pseudoaleatoria. Llama al rand para que devuelva la misma secuencia de números para cualquier semilla dada usada con srand. – TJD
Bien, bravo, eso es verdad. Pero para mantener el ejemplo corto y legible, no usé una semilla. – Mike
Debe cambiar el nombre '__wrap_foo' por' getRandomNumber'. (http://xkcd.com/221/) –