Reindirizzamento della console. Non eseguire l’installazione e il teardown del test

Questo è un seguito dall’acquisizione dell’output inviato a Console.Out dall’interno di un test unitario? e l’ articolo di riferimento nella risposta accettata di Mark Seemann.

Vorrei usare Console.Out e Console.In per redirect i flussi durante il test. Ogni test della class deve utilizzare i reindirizzamenti.

Per mantenere puliti i test, vorrei farlo nel test SetUp e TearDown.

Questo è quello che stavo pensando:

private StringWriter _sw; private StringReader _sr; [SetUp] public void SetUp() { _sw = new StringWriter(); Console.SetOut(_sw); _sr = new StringReader("100"); Console.SetIn(_sr); } [TearDown] public void TearDown() { var standardOut = new StreamWriter(Console.OpenStandardOutput()); standardOut.AutoFlush = true; Console.SetOut(standardOut); Console.SetIn(new StreamReader(Console.OpenStandardInput())); } 

Quindi userei ‘_sw.ToString ()’ all’interno dei test per verificare cosa è stato scritto nello stream.

Ci sono grossi inconvenienti nell’usare metodi di setup o di demolizione per questo? Sarebbe simile al reindirizzamento con un’istruzione using ? Per esempio

 using (StringWriter sw = new StringWriter()) { ... } 

    Ci sono grossi inconvenienti nell’usare metodi di setup o di demolizione per questo?

    Sì, anche se potrebbe non essere misurabile.

    Il modo in TearDown metodo Setup e TearDown è descritto qui, due nuovi oggetti usa e getta vengono creati per ogni test, ma non vengono mai eliminati. Alla fine andranno fuori campo e saranno finalizzati quando il garbage collector viene eseguito, ma può accadere in modo meno deterministico. In teoria, userà più memoria e istruzioni del processore che se fossero disposte in modo deterministico, ma come Knuth ci ha insegnato 40 anni fa, dovremmo misurare invece di impegnarci in ottimizzazioni premature.

    Il mio problema principale con l’uso dello stato mutabile e dell’impostazione implicita e di Teardown è che non è thread-safe, quindi se si desidera eseguire i test unitari in parallelo, non è ansible.