1

我正在使用 C# 4.0。

我正在使用Microsoft.VisualStudio.TestTools.UnitTesting.

我的 UnitTest 项目测试另一个项目,比如 ProjectA。ProjectA 创建一个这样的过程:

Process mplex = new Process();
psi = new ProcessStartInfo();
psi.CreateNoWindow = true;
psi.UseShellExecute = false;
psi.RedirectStandardError = true;
psi.FileName = "cmd.exe";
psi.Arguments = "/C mplex omittedForBrevity";
mplex.StartInfo = psi;
mplex.Start();

/* This is telling me: "'mplex' is not recognized 
 * as an internal or external command, operable 
 * program or batch file." */
var a = mplex.StandardError.ReadToEnd();

我已将“MPLEX.exe”放在各种 bin 中,包括“AppDomain.CurrentDomain.BaseDirectory”(这是我的 UnitTest 项目的 \bin\Debug\ 文件夹)。

MPLex.exe 基本上是微软对 GPLEX 的衍生产品,它是 Flex/Lex 的 C# 版本。当我在 ProjectA 中添加对 MPLex.exe 的引用并在对象浏览器中查看它时,我看不到任何看起来像 的方法Main或与之交互的公共方式,否则我会这样做而不是通过 cmd 调用它我上面已经做了。

我认为正在发生的事情是在进行单元测试时,它不是在搜索 \bin\Debug\ 目录。当我从非单元测试 ProjectB 中的 Main 方法在 ProjectA 中运行相同的代码时,它工作正常。如果我能以某种方式强烈引用 .exe 以便将其复制到需要的任何地方,那么我认为我的问题将得到解决。我怎样才能做到这一点?

编辑:

添加这个修复了它,但据我所知,我可能刚刚破坏了其他尚未为人所知的东西。

System.IO.Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
4

3 回答 3

1

mstest 不会在 bin 之外运行您的单元测试。它将测试和引用的程序集复制到测试部署文件夹,通常位于解决方案目录中的 TestResults 下。我已经对类似的组件进行了“单元”测试,并且总是需要使用部署功能,这对于如此简单的事情来说使用起来很头疼,但是就在这里。

首先,您的测试设置必须启用部署。转到 testsettings 文件并选择部署选项卡,然后单击启用部署。根据您的解决方案的结构,您可以在此处添加 mplex 文件。在我们的项目中,我不这样做,因为必要的文件通常位于测试的源代码控制树之外,并且 VS 会抱怨,如果是这种情况,请使用我在下面描述的文件链接。

您还可以将 DeploymentItem 属性添加到特定测试或测试类,并且只有在运行这些测试时才会复制该文件。如果它是您不想一直复制的大型数据文件,这将很有帮助。

如果必要的文件在测试解决方案之外,请将必要的文件作为链接添加到测试项目中,并将构建操作设置为始终复制。然后要么添加到 testsettings 中的已部署文件,要么使用 DeploymentItem 属性。

于 2012-07-22T07:45:02.667 回答
1

在项目中引用 .exe bin 是一种不好的做法。我建议: - 在您的环境路径变量上设置 mplex 的路径 - 从 cmd 调用 mplex (即 mplex 作为 shellexecute 上的参数命令行)

于 2012-07-22T08:10:09.583 回答
1

.exe 是 C# 编译的代码,与 dll 类似,只是它具有描述代码入口点的附加标头。

我做了以下步骤,它对我有用。

1 - 使用静态方法 Main 和非静态方法创建 exe

namespace TestConsole1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.Write("hello 1st");
        }

        public void TestMethod2()
        {
            Console.Write("hello 2nd");
        }
    }
}

2 - 在另一个类库项目中引用它作为项目引用,下面的代码工作正常。

TestConsole1.Program prg = new TestConsole1.Program();

prg.TestMethod2();

我还尝试将 exe 名称从“some.exe”更改为“some.dll”,然后在项目中引用它,它也运行良好。

于 2012-07-22T06:27:28.227 回答