2010-01-26 8 views
31

Buduję test jednostkowy w języku C# z NUnit i chciałbym przetestować, czy główny program faktycznie wyprowadza właściwy wynik w zależności od argumentów wiersza poleceń.Chwytanie danych wyjściowych wysyłanych do konsoli. Czy w ramach testu jednostkowego?

Czy istnieje sposób z metody testowej NUnit, która wywołuje Program.Main(...), aby pobrać wszystkie dane zapisane w Console.Out i Console.Error, aby móc je zweryfikować?

+1

To jest test integracji, a nie test jednostkowy. –

+0

Zgadzam się, zmieniam układ rozwiązania, aby to teraz odzwierciedlał. –

+0

Chociaż jest to coś w rodzaju szarej strefy, właściwie nie wzywam żadnego zewnętrznego programu, tylko wywołuję kod w moim pliku programu, ale nadal uważam, że jest bardziej jak test integracyjny niż test jednostkowy. –

Odpowiedz

55

można przekierować Console in, out i błędów niestandardowych StringWriters, jak to

[TestMethod] 
public void ValidateConsoleOutput() 
{ 
    using (StringWriter sw = new StringWriter()) 
    { 
     Console.SetOut(sw); 

     ConsoleUser cu = new ConsoleUser(); 
     cu.DoWork(); 

     string expected = string.Format("Ploeh{0}", Environment.NewLine); 
     Assert.AreEqual<string>(expected, sw.ToString()); 
    } 
} 

Zobacz this blog post dla pełnych szczegółów.

+0

Pracowałem jak czar, dzięki! –

+0

Jeśli użyjesz Resharper, stracisz ekran wyjściowy dla wszystkich dalszych testów, wykonując to :( –

+0

@EgorPavlikhin: powinieneś zresetować standardowe wyjście na końcu każdego testu używając 'Console.SetOut (new StreamWriter (Console.OpenStandardError()) '(może być konieczne również ustawienie' Autoflush' na true), po czym będzie działać z każdym testrem, włączając R #. – Abel

8

Można użyć tej prostej klasy, aby uzyskać wyjście z wykorzystaniem rachunku:

public class ConsoleOutput : IDisposable 
{ 
    private StringWriter stringWriter; 
    private TextWriter originalOutput; 

    public ConsoleOutput() 
    { 
     stringWriter = new StringWriter(); 
     originalOutput = Console.Out; 
     Console.SetOut(stringWriter); 
    } 

    public string GetOuput() 
    { 
     return stringWriter.ToString(); 
    } 

    public void Dispose() 
    { 
     Console.SetOut(originalOutput); 
     stringWriter.Dispose(); 
    } 
} 

Oto przykład, jak go używać:

using (var consoleOutput = new ConsoleOutput()) 
{ 
    target.WriteToConsole(text); 

    Assert.AreEqual(text, consoleOutput.GetOuput()); 
} 

można znaleźć bardziej szczegółowe informacje oraz działający przykład kodu na moim blogu tutaj - Getting console output within a unit test.

+1

Nie przeczytałeś często zadawanych pytań dotyczących samodzielnej promocji. Każda opublikowana odpowiedź stanowiła link do Twojego bloga. –

Powiązane problemy