2010-01-26 4 views
31

C#에서 NUnit을 사용하여 유닛 테스트를하고 있는데, 주 ​​프로그램이 명령 행 인수에 따라 실제로 올바른 결과를 출력하는지 테스트하고 싶습니다.단위 테스트 내에서 Console.Out으로 보낸 출력을 가져 오는 중입니까?

NUnit 테스트 메서드에서 Program.Main(...)을 호출하여 Console.Out 및 Console.Error에 기록 된 모든 것을 가져 와서 확인할 수 있습니까?

+1

이것은 통합 테스트이며 단위 테스트가 아닙니다. –

+0

동의합니다. 솔루션 레이아웃을 수정하여 지금 반영하고 있습니다. –

+0

회색 영역에 있지만 실제로 프로그램 파일에서 코드를 호출하는 외부 프로그램을 호출하지는 않지만 여전히 단위 테스트보다 통합 테스트 같다고 생각합니다. –

답변

55

당신은 자세한 내용에 대한 this blog post를 참조하십시오이

[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()); 
    } 
} 

처럼, 사용자 정의 StringWriters에 콘솔에서 출력 및 오류를 리디렉션 할 수 있습니다.

+0

매력처럼 일했습니다. 고마워요! –

+0

Resharper를 사용하는 경우 다음 테스트를 수행 할 때마다 출력 화면이 사라집니다. ( –

+0

@EgorPavlikhin : Console.SetOut (new StreamWriter (Console.OpenStandardError())를 사용하여 각 테스트가 끝날 때 stdout을 재설정해야합니다. '(Autoflush를 true로 설정해야 할 수도 있습니다.) 그 후에 R #을 포함하여 테스트 러너와 함께 작동합니다. – Abel

8

당신은 사용하여 문을 출력 얻을이 간단한 클래스를 사용할 수 있습니다 :

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

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

더 자세한 정보와를 찾을 수 있습니다 여기에

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(); 
    } 
} 

것은 그것을 사용하는 방법을 예입니다 내 블로그 게시물의 작업 코드 샘플 - Getting console output within a unit test.

+1

당신은 자기 홍보 FAQ를 읽지 않았습니다. 귀하가 게시 한 모든 답변은 귀하의 블로그에 대한 링크였습니다. –

관련 문제