Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何强引用.exe文件?_C#_Unit Testing - Fatal编程技术网

C# 如何强引用.exe文件?

C# 如何强引用.exe文件?,c#,unit-testing,C#,Unit Testing,我用的是C4.0 我正在使用Microsoft.VisualStudio.TestTools.UnitTesting运行单元测试 我的UnitTest项目测试另一个项目,比如ProjectA。ProjectA创建了如下过程: Process mplex = new Process(); psi = new ProcessStartInfo(); psi.CreateNoWindow = true; psi.UseShellExecute = false; psi.RedirectStandard

我用的是C4.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的派生,GPLEX是Flex/Lex的C版本。当我在ProjectA中添加对MPLex.exe的引用并在对象浏览器中查看它时,我看不到任何类似于Main的方法或与之交互的公共方法,否则我会这样做,而不是像上面那样通过cmd调用它

我认为在进行单元测试时,它没有搜索\bin\Debug\目录。当我从非单元测试ProjectB中的主方法在ProjectA中运行相同的代码时,它工作得很好。如果我能以某种方式强烈引用.exe,这样它就可以被复制到任何需要的地方,那么我想我的问题就会得到解决。我该怎么做

编辑:

加上这个修复了它,但据我所知,我可能只是破坏了一些还没有被发现的东西

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

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,然后在project中引用它,效果也很好。

mstest不会在bin之外的位置运行单元测试。它将测试和引用的程序集复制到测试部署文件夹中,通常位于解决方案目录中的TestResults下。我已经对类似的组件进行了单元测试,并且总是需要使用部署特性,对于如此简单的东西来说,使用这些特性是一件令人头疼的事情,但现在开始

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

您还可以向特定测试或测试类添加DeploymentItem属性,并且只有在运行这些测试时才会复制该文件。如果它是一个不希望一直复制的大型数据文件,那么这将非常有用


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

在项目中引用.exe bin是一种不好的做法。我建议: -在环境路径变量上设置mplex的路径 -在shellexecute上从命令行cmd调用mplex,该命令行是mplex as argument命令行
最好的方面

您能在测试项目中添加对mplex的引用吗?另外,mstest不会在bin之外运行测试,它会在运行之前复制到部署目录。我没有在测试项目中添加对MPLex.exe的引用。然而,一旦我这样做了,它仍然不起作用。我怀疑引用dll和exe不会被复制,除非编译器/链接器/任何东西确定它们实际被使用。至少不指向此单元测试使用的\out\bin目录。就您的格式而言,它是1。-我把它改成了1,它似乎起作用了。我不想花时间搞一个更优雅的解决方案哈。。。。问题是主方法不能公开访问,否则我会像你刚才那样做。我想我需要以某种方式引用.exe,而不是其中的方法或类。我想我需要什么可能是链接器来了解它。