2011-03-07 12 views
5

que tiene una función que toma en la entrada del usuario a través de std :: cin:caso de prueba para la función de impulso de tomar la entrada del usuario

std::getline(std::cin, in); 

y crea una estructura de datos correspondiente para que coincidan con una expresión regular. La función luego devuelve esta estructura de datos.

Estoy utilizando boost.test y quiero crear una prueba de unidad para verificar que el tipo de datos de salida sea correcto dado algunas entradas. Sin embargo, no sé cómo hacerlo ya que la entrada no se pasa como argumento para la función.

EDITAR: ¿Hay una manera simple de crear un caso de prueba de impulso que alimenta la función una cadena a través de la entrada estándar?

Respuesta

7

Si tiene acceso al código fuente de la función que llama a std::getline, entonces la solución más fácil es reescribirlo como un contenedor de otra función con la misma firma e implementación, pero tomando un parámetro adicional std::istream& que se usa en lugar de std::cin. Por ejemplo, si actualmente tiene:

my_struct my_func() 
{ 
    //... 

    std::getline(std::cin, in); 

    //... 
} 

Entonces reescribir como esto:

my_struct my_func(std::istream& is); 

inline my_struct my_func() 
{ 
    return my_func(std::cin); 
} 

my_struct my_func(std::istream& is) 
{ 
    //... 

    std::getline(is, in); 

    //... 
} 

esta manera, usted será capaz de probar la funcionalidad principal de my_func en secuencias de entrada construidos mediante el paso std::istringstream objetos en my_func(std::istream&).

Si no tiene acceso al código fuente de la función que llama al std::getline, entonces un truco que puede usar es reemplazar el estándar en el descriptor. Consulte this answer para ver el código que reemplaza el descriptor de salida estándar y modifíquelo en consecuencia.

+0

podría ser una pregunta estúpida, pero ¿debería la clase contenedora tener un nombre diferente al de la clase wrappee? – oadams

+1

@oadams: Supongo que quiere decir envoltura * función * y envuelta * función *, ¿correcto? C++ admite [función de sobrecarga] (http://msdn.microsoft.com/en-us/library/5dhe1hce%28VS.80%29.aspx), por lo que puede haber más de una función llamada 'my_func'. –

+0

oh, está bien. sí, función - ¡Ups! – oadams

Cuestiones relacionadas