如何测试Process ExitCode值?VS测试资源管理器DLL缺失问题
问题
我有一套特定场景下的进程终止机制,目标.exe依赖对应的.dll文件。这套机制在生产环境和开启“Copy referenced assemblies to workspace”设置的NCrunch中运行正常,但在Visual Studio Test Explorer里无法正常工作。
测试启动后立即崩溃,预期能拿到明确含义的特定ExitCode,但始终得到-532462766。系统日志和捕获的控制台输出都证实存在DLL缺失问题。排查后发现,测试工具生成的临时目录中,.exe和DLL文件位于不同子目录,而NCrunch会把所有文件放在主临时目录,所以能正常运行。
我希望在不通过创建环境包装进行Mock的前提下,真实测试进程能否启动并在特定条件下自行终止。以下是简化后的项目代码:
主项目(ExternalProcess)
namespace ExternalProcess { public class Program { public static void Main(string[] args) { CommonCode.Enums.ProcessType processType = (CommonCode.Enums.ProcessType)Enum.Parse(typeof(CommonCode.Enums.ProcessType), args[0]); switch (processType) { case CommonCode.Enums.ProcessType.TEST: case CommonCode.Enums.ProcessType.PROD: case CommonCode.Enums.ProcessType.DEV: Environment.Exit((int)processType); break; default: Environment.Exit((int)CommonCode.Enums.ProcessType.ERROR); break; } } } }
附加DLL(ExternalProcess.CommonCode)
namespace ExternalProcess.CommonCode.Enums { public enum ProcessType { PROD, TEST, DEV, ERROR } }
测试项目(ExternalProcessTests)
using System.Reflection; using FluentAssertions; using Xunit; namespace ExternalProcessTests { public class ProcessTests { [Fact] public void TestProcess() { var processType = ExternalProcess.CommonCode.Enums.ProcessType.TEST; var process = new System.Diagnostics.Process { EnableRaisingEvents = false }; process.StartInfo.FileName = Assembly.GetAssembly(typeof(ExternalProcess.Program)).Location; process.StartInfo.UseShellExecute = true; process.StartInfo.CreateNoWindow = true; process.StartInfo.Arguments = processType.ToString(); process.Start(); process.WaitForExit(); process.HasExited.Should().BeTrue(); process.ExitCode.Should().Be((int)processType); } } }
内容的提问来源于stack exchange,提问作者S. Kalinowski
相关产品推荐
相关产品推荐

