在NUnit Mono中运行命令行参数

时间:2016-07-18 15:43:57

标签: c# macos xamarin mono nunit

我在OSX上使用Xamarin 6.0.1,mono 4.4.1和NUnit 3.4.1来运行运行命令行参数的类库类

" ios-deploy"。直接在终端上返回:" / usr / local / bin / ios-deploy"

然而,在我的应用程序中,命令返回" / usr / bin /其中"

关于如何让应用程序返回终端返回的内容的任何想法?

请参阅下面的代码,感谢您的想法。

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;
    }
}

单元测试

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

3 个答案:

答案 0 :(得分:2)

更新:刚刚从您的评论中意识到这是由于您在Xamarin Studio / MonoDevelop中运行测试。

在应用程序中启动Process时,如果本身尚未获得shell环境,即您单击了图标以启动它,则从cli启动它,您需要告诉您的进程以登录shell(man bash以获取详细信息)以运行您的bash配置文件并获取路径设置等...

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

替换:

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

使用:

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

输出:

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


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

答案 1 :(得分:0)

替换

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

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

您正在将which传递给which,这就是您看到which路径的原因:)

修改

如果从参数中删除which会导致空字符串,那么可能是因为ios-deploy位于您的用户路径上。您可能需要设置p.LoadUserProfile = true,您可能需要升级到NUnit 3.4.1并使用命令行选项--loaduserprofile。与查理的建议一起,它应该有效。

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

答案 2 :(得分:0)

您在流程完成之前捕获输出。您需要在WaitForExit之后移动这些行。