2009-08-17 3 views
8

Sono un principiante ai test unitari. Come controllo l'uscita della console? HoAiuto test unità. Come posso testare l'uscita di un messaggio alla console?

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


} 

Come devo correttamente essere prove? Grazie per qualsiasi suggerimento. Cheers, ~ ck

risposta

0

Questo non è affatto quello che faresti.

nel test in genere si verifica per lo stato dell'oggetto, con qualcosa come:

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

A seconda di come funziona il quadro prescelto. Quindi dovrai cambiare il tuo approccio, in generale, per conformarti a questo modello.

4

Non è necessario testare la routine 'Console.WriteLine' perché è necessario presumere che funzioni: non è il codice, quindi perché si desidera testarlo. È necessario verificare se si produce corretta stringa che viene passata a 'Console.WriteLine'

In altre parole, invece di:

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

si potrebbe fare:

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

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

e poi in il test case:

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

Spero che sia d'aiuto. Regads Simon

+0

Che Assert sta solo testando il metodo produceXxCircle(), non che è stato chiamato il metodo draw. –

+0

Infatti, ma cosa vuoi testare? Se Console.WriteLine sta trasmettendo correttamente le stringhe alla console? Non dovresti testarlo, dal momento che Console.WriteLine non è il tuo codice. Fa parte del framework –

+0

Sì, il codice originale come indicato sta cercando di eseguire un test abbastanza vuoto - chiamando 's.DrawXXShape();' e quindi controllando che sia stato chiamato il metodo 'DrawXXShape'. Ma almeno sta iniziando con i test. –

14

La risposta letterale sarebbe che si usa Console.SetOut prima di chiamare la classe in prova a dirigere stdout in un MemoryStream o simili, il cui contenuto in seguito sarà possibile ispezionare.

La soluzione migliore sarebbe utilizzare un framework di simulazione, come Rhino Mocks, per creare un'istanza concreta della classe astratta, con un set di aspettative che il metodo DrawXXShape venga chiamato.

0

Suppongo che alcuni altri test eseguano il test delle funzionalità di disegno. Se si desidera verificare che le classi scrivano qualcosa in particolare sulla console, è necessario astrarre l'idea di scrivere sulla console.

Creare un'interfaccia con un metodo WriteLine() e iniettare istanze che implementano questa interfaccia in XXShapes. I test possono iniettare mock o stub in grado di catturare le stringhe scritte e testarne il contenuto nei test.