2009-08-17 10 views
8

Jestem początkującym w testowaniu jednostkowym. Jak sprawdzić wyjście konsoli? mamPomoc przy testowaniu jednostki. Jak przetestować wyjście komunikatu na konsolę?

namespace XXShapes 
{ 
    public abstract class XXShape 
    { 
     public virtual void DrawXXShape() 
     { 
      Console.WriteLine("The XXShape was drawn."); 

     } 
    } 

public class XXCircle : XXShape 
{ 
    public override void DrawXXShape() 
    { 
     Console.WriteLine("The XXCircle was drawn."); 
    } 
} 

}

namespace XXShapes.Test 
{ 
    [TestFixture] 
    public class XXShapeTest 
    { 
     [Test] 
     public void MyFirstTest() 
     { 
      XXShape s = new XXCircle(); 
      string expected = "The XXCircle was drawn."; 
      s.DrawXXShape(); 
      string actual = Console.ReadLine(); 
      Assert.AreEqual(expected, actual); 
     } 
    } 


} 

Jak należy prawidłowo testować to? Dzięki za wszelkie wskazówki. Pozdrowienia, ~ ck

Odpowiedz

0

To wcale nie jest to, co możesz zrobić.

W testu będzie typowo sprawdzenia stanu obiektu, z czymś takim:

Assert.IsTrue(foo.Field, Equals, "hello") 

W zależności od tego, jak działa Twój wybrany ramy. Musisz więc ogólnie zmienić swoje podejście, aby dostosować się do tego modelu.

4

Nie musisz testować procedury "Console.WriteLine", ponieważ musisz założyć, że działa - to nie jest twój kod, więc dlaczego chcesz go przetestować. Trzeba sprawdzić, czy można produkować prawidłowy ciąg, który jest przekazywany do „Console.WriteLine”

Innymi słowy, zamiast:

public override void DrawXXShape() 
{ 
    Console.WriteLine("The XXCircle was drawn."); 
} 

można zrobić:

public override void DrawXXShape() 
{ 
    Console.WriteLine(produceXxCircle()); 
} 

public string produceXxCircle() 
{ 
    return "The XXCircle was drawn."; 
} 

, a następnie w test:

Assert.AreEqual(produceXxCircle(), "The XXCircle was drawn."); 

Mam nadzieję, że to pomaga. Regads Simon

+0

To Assert to właśnie testowanie metody produceXxCircle(), a nie metoda wywoływania. –

+0

Rzeczywiście, ale co chcesz przetestować? Jeśli Console.WriteLine poprawnie wypisuje łańcuchy do konsoli? Nie powinieneś tego testować, ponieważ Console.WriteLine nie jest twoim kodem. To część struktury –

+0

Tak, oryginalny kod podany próbuje wykonać dość pusty test - wywołanie 's.DrawXXShape();', a następnie sprawdzanie, czy została wywołana metoda 'DrawXXShape'. Ale przynajmniej zaczyna się od testowania. –

14

Odpowiedź dosłowne byłoby to, że należałoby użyć Console.SetOut przed wywołaniem klasę badanego kierować stdout do MemoryStream lub podobny, którego zawartość można później sprawdzić.

Lepszą odpowiedzią byłoby zastosowanie szyderczego frameworka, takiego jak Rhino Mocks, w celu utworzenia konkretnej instancji klasy abstrakcyjnej, z zestawem oczekiwań, że zostanie wywołana metoda DrawXXShape.

0

Zakładam, że niektóre inne testy sprawdzają możliwości rysowania - Jeśli chcesz przetestować, że twoje klasy piszą coś konkretnego na konsolę, to powinieneś wymyślić pomysł napisania na konsolę.

Utwórz interfejs za pomocą metody WriteLine() i wprowadź instancje implementujące ten interfejs w XXShapes. Twoje testy mogą wstrzykiwać mocks lub stubs, które mogą przechwycić napisy i przetestować ich zawartość w testach.

Powiązane problemy