2016-07-18 19 views
0

Im mit Xamarin 6.0.1, Mono 4.4.1 und 3.4.1 NUnit auf OSX eine Klassenbibliothek Klasse auszuführen, die eine Befehlszeilenargument läuftLaufbefehlszeilenargumente in NUnit Mono

"die ios-deploy" . Direkt am Terminal diese zurückgibt: "/ usr/local/bin/ios-deploy"

Wie auch immer, in meiner Anwendung, gibt der Befehl "/ usr/bin/die"

Irgendwelche Ideen, wie Ich kann die Anwendung zurückgeben, was das Terminal zurückgibt?

Siehe meinen Code unten, danke für Ihre Gedanken.

public class ProcesRunner 
{ 

    public string getProcess() 
    { 
     ProcessStartInfo p = new ProcessStartInfo("/usr/bin/which", "which ios-deploy"); 
     p.CreateNoWindow = true; 
     p.RedirectStandardOutput = true; 
     p.RedirectStandardError = true; 
     p.UseShellExecute = false; 
     Process pg = new Process(); 
     pg.StartInfo = p; 
     pg.Start(); 
     string strOutput = pg.StandardOutput.ReadToEnd(); 
     string strError = pg.StandardError.ReadToEnd(); 
     Console.WriteLine(strError); 
     pg.WaitForExit(); 
     return strOutput; 
    } 
} 

Einheit Test

[TestFixture()] 
    public class Test 
    { 
    [Test()] 
    public void TestCase() 
    { 
     ProcesRunner pr = new ProcesRunner(); 
     string outvar = pr.getProcess(); 
     Console.WriteLine(outvar); 
    } 
} 

Antwort

2

aktualisieren: Gerade aus Ihre Kommentare dies auf Sie realisiert laufen die Tests innerhalb Xamarin Studio/MonoDevelop.

Wenn Sie eine Process innerhalb einer Anwendung starten, die selbst keine Shell-Umgebung erhalten hat, dh Sie auf ein Symbol geklickt haben, um es zu starten, oder vom CLI aus starten, müssen Sie Ihrem Prozess mitteilen, dass er als Login-Shell ausgeführt werden soll (man bash für Details), um Ihr bash Profil laufen und Ihre Pfadeinstellungen aufheben, etc ...

-l  Make bash act as if it had been invoked as a login shell 

ersetzen:

ProcessStartInfo p = new ProcessStartInfo("/usr/bin/which", "which ios-deploy"); 

mit:

ProcessStartInfo p = new ProcessStartInfo("/bin/bash", "-l -c 'which ios-deploy'"); 

Ausgang:

nunit-console -nologo bin/Debug/WhichTest.dll 
. 
/usr/local/bin/ios-deploy 


Tests run: 1, Failures: 0, Not run: 0, Time: 0.049 seconds 
+0

Leider funktioniert es nicht, im Debug-Modus ist strOutput leer. Danke für den Vorschlag. – mogoli

+0

@mogoli Seltsam, dein Code mit meiner Änderung funktioniert für mich ....Verursacht '/ bin/bash -c 'welche ios-deploy' auf der cmd-Zeile den vollständigen Pfad von iOS-deploy nicht zurück? – SushiHangover

+0

Seltsamerweise, darf ich fragen, welche Version von Xamarin, Nunit und Mono Sie verwenden? Der Befehl funktioniert direkt am Terminal. – mogoli

0

ersetzen

ProcessStartInfo p = new ProcessStartInfo("/usr/bin/which", "which ios-deploy"); 

mit

ProcessStartInfo p = new ProcessStartInfo("/usr/bin/which", "ios-deploy"); 

Du which-which vorbei, weshalb Ihr den Weg :)

- which sehen

bearbeiten

Wenn in einem leeren String which von den Argumenten Ergebnissen zu entfernen, dann ist es wahrscheinlich, weil ios-deploy auf Ihrem Benutzerpfad ist. Möglicherweise müssen Sie p.LoadUserProfile = true festlegen, und Sie müssen möglicherweise auf NUnit 3.4.1 aktualisieren und die Befehlszeilenoption --loaduserprofile verwenden. Zusammen mit Charlies Vorschlägen sollte es funktionieren.

Siehe https://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.loaduserprofile(v=vs.110).aspx

+0

ProcessStartInfo p = neue ProcessStartInfo ("/ usr/bin/which", "ios-deploy"); Gibt eine leere Zeichenfolge zurück. Der Pfad von ios-deploy wird leider nicht gedruckt. Danke für den Vorschlag – mogoli

+0

Ich habe Informationen über die Verwendung von 'LoadUserProfile' hinzugefügt. –

+0

Das Problem scheint mit dem Ausführen des Tests in der Xamarin IDE zu sein. Es funktioniert, wenn ich den Test vom Terminal aus führe. Weird – mogoli

0

Sie erfassen die Ausgabe, bevor der Prozess abgeschlossen ist. Sie müssen diese Zeilen nach dem WaitForExit verschieben.

+0

Ich habe das versucht, aber es funktioniert nicht – mogoli

+0

pg.Start(); \t \t \t pg.WaitForExit(); \t \t \t Zeichenfolge strOutput = pg.StandardOutput.ReadToEnd(); \t \t \t Zeichenfolge strerror = pg.StandardError.ReadToEnd(); – mogoli

+0

Danke für den Vorschlag – mogoli