我正在使用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();
我在各种bin中放置了“MPLex.exe”,包括“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);
答案 0 :(得分:1)
.exe是一个C#编译代码,类似于dll,除了它有附加标题,描述了代码的入口点。
我做了以下步骤,它对我有用。
1 - 使用静态方法Main和非静态方法
创建了一个exenamespace 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();
我也试过更改" some.exe"的exe名称。 to" some.dll"然后在项目中引用它,它也运行良好。
答案 1 :(得分:1)
mstest不会在bin中运行您的单元测试。它将测试和引用的程序集复制到测试部署文件夹,通常位于解决方案目录中的TestResults下。我已经“单元”测试了类似的组件,并且总是需要使用部署功能,这对于如此简单的事情来说是一件令人头疼的问题,但是这里也是如此。
首先,您的测试设置必须启用部署。转到testsettings文件并选择部署选项卡,然后单击enable deployment。根据解决方案的结构,您可以在此处添加mplex文件。在我们的项目中,我不这样做,因为必要的文件通常在测试的源控制树之外,VS会抱怨,如果是这种情况,请使用我在下面描述的文件链接。
您还可以将DeploymentItem属性添加到特定测试或测试类,并且只有在运行这些测试时才会复制该文件。如果它是一个您不想一直复制的大型数据文件,这将非常有用。
如果必要的文件在测试解决方案之外,则在测试项目中添加必要的文件作为链接,并将构建操作设置为始终复制。然后添加到testsettings中的已部署文件或使用DeploymentItem属性。
答案 2 :(得分:1)
在项目中引用.exe bin是一种不好的做法。我建议: - 在您的环境路径变量上设置mplex的路径 -call mplex from cmd by(在shellexecute上作为参数命令行的复杂) 最好的关注