2012-04-16 4 views
5

Poniższa funkcja pobiera dane wejściowe od użytkownika. Muszę przetestować tę funkcję za pomocą Unit Testing. Czy każdy może mi powiedzieć, jak przetestować tego rodzaju funkcję, która wymaga dynamicznego wprowadzania danych przez użytkownika. DziękiJak zastosować testowanie jednostek do funkcji C#, która wymaga dynamicznego wprowadzania danych przez użytkownika?

jak boundary value analysis ...

numberOfCommands powinny być (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; 
} 

Programowo wskazówka będzie bardzo pomocne!

+0

Wystarczy uruchomić program. Podaj dane wejściowe. masz na myśli testy jednostkowe? – Sandeep

+0

tak dla testów jednostkowych .. podobnie jak test wartości brzegowej dla 'numberOfCommands' powinien wynosić' 0 <= n <= 100'. – rana

Odpowiedz

10

Utwórz interfejs i przekaż interfejs, aby odebrać tekst. Następnie, w teście jednostki, podaj fałszywy interfejs, który automatycznie zwraca pewien wynik.

Edycja dla szczegółów Kod:

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 Znany również jako "Dependency Injection". To jest prawidłowe podejście. –

0

można przekierować dane z pliku do standardowego wejścia, i użyć w swoich testach. Możesz to zrobić programowo w samym programie lub poprzez powłokę, która uruchamia program.

Można również ekstrapolować wszystko "dane wejściowe użytkownika" na ich własne klasy/funkcje, aby łatwo było zastąpić funkcję, która "pobiera wiersz tekstu od użytkownika", funkcją, która "zwraca ten ciąg kodowy do testowania ". Jeśli każda z tych funkcji znajduje się w klasach, które implementują wspólny interfejs, to przełączanie ich jest bardzo łatwe.

0

W main() można po prostu zrobić:

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

Jednak nie wiem, czy to rodzaj testu pan chce. Czy istnieje więcej pytań niż po prostu testowanie wyniku działania?

+0

Mam na myśli testowanie jednostkowe dla powyższej funkcji !! – rana

2

dwóch istotnych rzeczy:

  1. Console.ReadLine jest zewnętrznym zależność i powinny być warunkiem do sposobu, w jakiś sposób (najlepiej poprzez wstrzyknięcie zależności)
  2. Console.ReadLine wykorzystuje TextReader klasę bazową pod maską, a to powinno być dostarczone:

Twoja metoda wymaga zależności od TextReader (Można abstrakcyjny go jeszcze bardziej z interfejsu niestandardowego, ale dla celów testowania wystarczy):

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

Teraz w rzeczywistej aplikacji wywołać Get_Commands używając prawdziwej konsoli:

int commandsNumber = Get_Commands(Console.In); 

w twojej testów jednostkowych, tworzyć fałszywe wejście za pomocą na przykład StringReader klasa:

[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 dla StringReader, to miłe – grinch