2013-07-12 17 views
6

Devo utilizzare il framework di test dell'unità VS per garantire che tutto il codice funzioni correttamente. Tuttavia sto avendo MOLTO difficoltà a ottenere test che richiedono il funzionamento degli argomenti della riga di comando (dal momento che gli input da riga di comando devono essere forniti in fase di esecuzione ... e con i test di unità non esiste un vero "runtime"). C'è un modo per eseguire i miei test unitari con gli input degli argomenti della riga di comando? Ho capito che questo non è il modo ideale per costruire un programma, ma sfortunatamente non decido come funziona il processo di test.Argomenti della riga di comando con Visual Studio Unit Test C#

Ho letto che posso potenzialmente scrivere un file batch e includerlo nella cartella MStest/testcontainer. Ci sono alcuni colpi che devo cancellare per poterlo fare in questo modo. Questi includono precipita:

1) Non so nulla di file batch

2) Non so dove la cartella MSTest/testcontainer è, come accedervi, come funziona, o anche come aggiungere file ad esso (dal momento che sembra essere nascosto o non facilmente accessibile).

3) Non so cosa farei con il file batch anche se è stato scritto correttamente e nella cartella MStest/testcontainer. Come mai i miei test dovrebbero anche sapere che è lì, per non parlare di prendere input da esso?

Quindi, per riassumere: Come si fanno i test delle unità VS in argomenti della riga di comando? Se DEVO usare il metodo del file batch, apprezzerei molto che mi venisse spiegato come se fossi 5. Mi scuso se appaio un po 'impotente in questo argomento, ma non riesco a trovare spiegazioni chiare o utili su come ognuna di queste cose funziona all'interno di questo specifico contesto.

Grazie mille.

risposta

0

È possibile avviare una nuova istanza del programma con il metodo di prova con Process class. Qualcosa di simile:

Process prop = new Process(); 
prop.StartInfo.FileName = "myProgram.exe"; 
prop.StartInfo.Arguments = "-arg1 -arg2"; 
prop.StartInfo.RedirectStandardOutput = true; 
prop.StartInfo.RedirectStandardInput = true; 
prop.Start(); 
// You can then use prop.StandardInput and prop.StandardOutput for testing. 
prop.WaitForExit(); 
int code = prop.ExitCode; 
+0

Questo sembra molto più facile di quella sciocchezza di tutto il file batch! Quale spazio dei nomi è Process under? Inoltre, come potrei usare l'elica nei miei test? Ad esempio, arg1 è l'input che devo accedere, dovrei semplicemente dire: "prop.StandardInput.arg1" per accedere ad arg1 per l'uso nelle mie funzioni di test? –

+0

prop.StandardInput e prop.StandardOutput sono solo flussi da cui è possibile inviare e leggere il testo. Questo sarebbe fondamentalmente un test blackbox per il programma. Ciò non darebbe accesso a metodi/variabili specifici. Proverebbe solo a dare un determinato input, si ottiene l'output corretto. – Cemafor

+0

Ora tutto sembra funzionare senza problemi grazie al tuo aiuto. Grazie mille. –

2

breve, risolverà il tuo problema, e l'approccio corretto unit testing :-):

Se il programma richiede argomenti della riga di comando, allora dovrebbe avere static void Main(string[] args) metodo.

Basta scrivere i test di unità per chiamare questo metodo con qualsiasi argomento della riga di comando che si aggiungerebbe normalmente.

più a lungo, molto meglio così: Split funzionalità yout in 2 - una classe che fa il lavoro, e solo un programma semplice, che ottiene gli argomenti della riga di comando e li passa al lavoratore.

I test di scrittura 2 unità - uno, che Main (xxx) in realtà trasmette gli argomenti alla classe, e molti test di unità per il tuo effettivo lavoratore per verificarne il comportamento in base a questi argomenti.

Problemi correlati