2015-04-06 14 views
5

Mi piacerebbe scrivere un test unitario per un metodo che stampa sullo standard output. Ho già modificato il codice in modo che venga stampato su un'istanza passata File invece che sia stdout per impostazione predefinita. L'unica cosa che mi manca è l'istanza in memoria File che potrei passare. C'è una cosa del genere? Qualche raccomandazione? Vorrei qualcosa di simile ha funzionato:File in memoria per l'unittest

import std.stdio; 

void greet(File f = stdout) { 
    f.writeln("hello!"); 
} 

unittest { 
    greet(inmemory); 
    assert(inmemory.content == "hello!\n") 
} 

void main() { 
    greet(); 
} 

Qualsiasi altro approccio per il codice di unit test che stampa a stdout?

+0

Questo bisogno di essere cross-platform? –

+0

No; Per esempio. la nuova linea su varie piattaforme potrebbe essere diversa. Non voglio testare questo aspetto, ma solo il contenuto stampabile. Quindi, invece di 'File' avrei bisogno di qualcosa come' OutputStreamWriter' in Java, cioè rimango nel livello di caratteri unicode piuttosto che in encoding, filesystem, ecc. Sarebbe bello se il mio test fosse eseguito su tutte le piattaforme ovviamente ... – Tamas

risposta

1

Invece di fare affidamento su File che è un tipo piuttosto basso, passare l'oggetto tramite un'interfaccia.

Come avete aluded al tuo commento OutputStreamWriter in Java è un wrapper di molte interfacce progettato per essere un'astrazione su flussi di byte, ecc farei lo stesso:

interface OutputWriter { 
    public void writeln(string line); 
    public string @property content(); 
    // etc. 
} 

class YourFile : OutputWriter { 
    // handle a File. 
} 

void greet(ref OutputWriter output) { 
    output.writeln("hello!"); 
} 

unittest { 

    class FakeFile : OutputWriter { 
     // mock the file using an array. 
    } 

    auto mock = new FakeFile(); 

    greet(inmemory); 
    assert(inmemory.content == "hello!\n") 
} 
+0

Grazie! Vorrei che una simile struttura fosse fornita dalla libreria standard. O una qualche forma di derisione per evitare del tutto il codice nel codice di 'produzione'. In questo modo scrivere con tutto è fischietto e campane non è adatto per il codice di produzione. – Tamas

+0

Qui ci sono molte librerie di test delle unità disponibili: http://code.dlang.org/ Quello che ho scritto contiene funzionalità di simulazione. https://github.com/nomad-software/dunit –

+0

Grazie! Ho iniziato a cercare ... ovviamente preferirei qualcosa senza dipendenze esterne. Per ora salta l'unittesting di questa parte. :) – Tamas