2012-04-16 16 views
5

La siguiente función obtiene la entrada del usuario. Necesito probar esta función usando Unit Testing. ¿Alguien puede decirme cómo probar este tipo de función que requiere la entrada del usuario de forma dinámica. Gracias¿Cómo aplico la prueba unitaria a la función C# que requiere la entrada del usuario de forma dinámica?

como boundary value analysis ...

numberOfCommands debe ser (0 <= n <= 100)

public static int Get_Commands() 
{ 
    do 
    { 
     string noOfCommands = Console.ReadLine().Trim(); 
     numberOfCommands = int.Parse(noOfCommands);    
    } 
    while (numberOfCommands <= 0 || numberOfCommands >= 100); 

    return numberOfCommands; 
} 

programación pista será de gran ayuda!

+0

basta con ejecutar el programa. Dar entrada. ¿te refieres a la prueba unitaria? – Sandeep

+0

sí para la prueba unitaria ... como la prueba de valor límite para 'numberOfCommands' debe ser' 0 <= n <= 100'. – rana

Respuesta

10

Crea una interfaz y pasa la interfaz para recibir el texto. Luego, en su prueba de unidad, pase una interfaz simulada que devuelve automáticamente algún resultado.

Editar los detalles de código:

public interface IUserInput{ 
    string GetInput(); 
} 

public static int Get_Commands(IUserInput input){ 
    do{ 
     string noOfCommands = input.GetInput(); 
     // Rest of code here 
    } 
} 

public class Something : IUserInput{ 
    public string GetInput(){ 
      return Console.ReadLine().Trim(); 
    } 
} 

// Unit Test 
private class FakeUserInput : IUserInput{ 
     public string GetInput(){ 
      return "ABC_123"; 
     } 
} 
public void TestThisCode(){ 
    GetCommands(new FakeUserInput()); 
} 
+0

+1 También conocido como "Dependency Injection". Este es el enfoque correcto. –

0

puede redirigir la entrada de un archivo a la entrada estándar, y el uso que en sus pruebas. Puede hacerlo programáticamente en el programa mismo o a través del shell que ejecuta el programa.

También podría extrapolar todo el 'usuario ingresado' en sus propias clases/funciones para que sea fácil reemplazar una función que 'obtiene una línea de texto del usuario' con una función que 'devuelve esta cadena codificada para pruebas '. Si cada una de estas funciones está en clases que implementan una interfaz común, es muy fácil cambiarlas.

0

en main() sólo se puede hacer:

int testCommand=Get_Commands(); 
Console.WriteLine(testCommand); 

Sin embargo, no sé si ese es el tipo de prueba que faltaban. ¿Hay algo más a la pregunta que simplemente probar el resultado de la función?

cosas
+0

me refiero a la prueba unitaria de la función anterior !! – rana

2

Dos esenciales:

  1. Console.ReadLine es una dependencia externa y deben ser proporcionan a su método de alguna forma (preferentemente por medio de la inyección de dependencia)
  2. Console.ReadLine utiliza TextReader clase base bajo el capó, y eso es lo que debe proporcionarse

Entonces, lo que su método necesita es la dependencia de TextReader (Se podía abstracta que sea aún más con la interfaz personalizada, pero para el propósito de probar que es suficiente):

public static int Get_Commands(TextReader reader) 
{ 
    // ... use reader instead of Console 
} 

Ahora, en la aplicación real se invoca Get_Commands usando verdadera consola:

int commandsNumber = Get_Commands(Console.In); 

En su prueba de la unidad, se crea la entrada falsa utilizando, por ejemplo StringReader clase:

[Test] 
public void Get_Commands_ReturnsCorrectNumberOfCommands() 
{ 
    const string InputString = 
     "150" + Environment.NewLine + 
     "10" + Environment.NewLine; 
    var stringReader = new StringReader(InputString); 

    var actualCommandsNumber = MyClass.Get_Commands(stringReader); 

    Assert.That(actualCommandsNumber, Is.EqualTo(10)); 
} 
+0

+1 para StringReader que es bueno – grinch

Cuestiones relacionadas