2013-07-12 3 views
6

Ich soll das VS-Unit-Testframework verwenden, um sicherzustellen, dass der gesamte Code korrekt funktioniert. Allerdings habe ich eine Menge Probleme beim Abrufen von Tests, die Befehlszeilenargumente benötigen, um zu funktionieren (da Befehlszeileneingaben zur Laufzeit angegeben werden müssen ... und bei Komponententests gibt es keine echte "Laufzeit"). Gibt es eine Möglichkeit, meine Komponententests mit Befehlszeilenargumenteingaben auszuführen? Ich erkannte, dass dies nicht der ideale Weg ist, ein Programm zu erstellen, aber ich entscheide leider nicht, wie der Testprozess funktioniert.Befehlszeilenargumente mit Visual Studio-Unit-Test C#

Ich habe gelesen, dass ich potenziell eine Batchdatei schreiben und in den MStest/testcontainer-Ordner aufnehmen kann. Es gibt einige Abstürze, die ich klären muss, um es auf diese Weise zu machen. Diese rast umfassen:

1) Ich weiß nichts über Batch-Dateien

2) Ich weiß nicht, wo die MSTest/testcontainer Ordner ist, wie es für den Zugriff, wie es funktioniert, oder sogar, wie Dateien hinzufügen dazu (da es scheinbar versteckt oder nicht leicht zugänglich ist).

3) Ich weiß nicht, was ich mit der Batch-Datei tun würde, auch wenn es korrekt geschrieben wurde und im Ordner MStest/testcontainer. Wie sollen meine Tests überhaupt wissen, dass es da ist, ganz zu schweigen davon, was ich daraus entnehme?

Also, um zusammenzufassen: Wie macht man VS Unit Tests in Kommandozeilenargumente? Wenn ich die Batch-Datei-Methode verwenden muss, würde ich es sehr schätzen, dass es mir erklärt wird, als wäre ich 5. Ich entschuldige mich, wenn ich ein wenig hilflos in diesem Thema erscheinen, aber ich kann keine klaren oder nützlichen Erklärungen finden wie irgendwelche dieser Dinge in diesem spezifischen Kontext funktionieren.

Danke eine Tonne.

Antwort

0

Sie könnten eine neue Instanz Ihres Programms innerhalb der Testmethode mit der Process class starten. Etwas wie:

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

Dies sieht viel einfacher als die ganze Batch-Datei Unsinn! Welcher Namespace ist Prozess unter? Auch wie würde ich in meinen Tests Prop verwenden? Zum Beispiel ist arg1 die Eingabe, auf die ich zugreifen muss, würde ich nur sagen: "prop.StandardInput.arg1", um auf arg1 zuzugreifen, um es in meinen Testfunktionen zu verwenden? –

+0

prop.StandardInput und prop.StandardOutput sind nur Streams, an die Sie Text senden und von denen Sie lesen können. Dies wäre grundsätzlich ein Blackbox-Test für das Programm. Dies würde keinen Zugriff auf bestimmte Methoden/Variablen geben. Es würde nur testen, dass bei einer bestimmten Eingabe die korrekte Ausgabe erhalten wird. – Cemafor

+0

Dank Ihrer Hilfe scheint jetzt alles reibungslos zu laufen. Vielen Dank. –

2

Kurz, Ihr Problem lösen, und eine falsche Herangehensweise an Unit-Tests :-):

Wenn Ihr Programm Befehlszeilenargumente erfordert, dann sollte es static void Main(string[] args) Methode haben.

Schreiben Sie einfach Ihre Komponententests, um diese Methode mit den Befehlszeilenargumenten aufzurufen, die Sie normalerweise hinzufügen würden.

Längere, viel bessere Art: Split yout Funktionalität in 2 - eine Klasse, die die Arbeit macht, und nur ein einfaches Programm, das die Befehlszeilenargumente erhält und sie an den Arbeiter übergeben.

Die Schreib-2-Unit-Tests - eine, die Main (xxx) tatsächlich die Argumente an Ihre Klasse und viele Komponententests für Ihren tatsächlichen Worker übergeben, um sein Verhalten basierend auf diesen Argumenten zu überprüfen.