2010-01-26 9 views
31

NUnit ile C# biriminde bir birim testi yapıyorum ve ana programın aslında komut satırı argümanlarına bağlı olarak doğru çıktıyı verdiğini test etmek istiyorum.Konsola gönderilen çıktıyı yakalama. Bir birim testinin içinden mi?

NUnit test yönteminden bir yol var mı? Program.Main(...), Console.Out ve Console.Error'a yazılan her şeyi kapmak için çağırıyor, böylece ona karşı doğrulayabilirim?

+1

Bu bir bütünleştirme testi ve bir birim testi değil. –

+0

Katılıyorum, şu anda bunu yansıtmak için çözüm düzenini yeniden çalıştırıyorum. –

+0

Gri ​​bir alan içinde olmasına rağmen, aslında herhangi bir harici programı çağırmıyorum, sadece programımdaki kodu çağırıyorum, ancak hala bir birleşme testinden çok bir entegrasyon testi gibi olduğunu düşünüyorum. –

cevap

55

Sen tüm detaylar için this blog post bakın bu

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

gibi özel StringWriters için Konsol yılında Out ve Hata yönlendirebilirsiniz.

+0

Bir çekicilik gibi çalıştık, teşekkürler! –

+0

Eğer Resharper kullanırsanız, bunu yaparak tüm diğer testler için çıktı ekranını kaybedersiniz :( –

+0

@EgorPavlikhin: Her bir testin sonunda stdout'u 'Console.SetOut (yeni StreamWriter (Console.OpenStandardError()) kullanarak sıfırlamanız gerekir. '(Autoflush'ı da true olarak ayarlamanız gerekebilir.) Bundan sonra, R # dahil olmak üzere herhangi bir test koşucusu ile çalışacaktır. – Abel

8

Bir using ifadesi ile çıktı almak için bu basit sınıfını kullanabilirsiniz:

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

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

daha detaylı bilgi ve bulabilirsiniz: Burada

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

bir nasıl kullanılacağını örnektir blog yazımdaki çalışma kodu örneği - Getting console output within a unit test.

+1

Kendi kendine tanıtım SSS'sini okumadınız. Gönderdiğiniz her bir cevap blog'unuzun bir bağlantısı oldu. –