我有一种在某些情况下终止进程的机制。鉴于 *.exe 需要 *.dll。在生产和 NCrunch 中一切正常(如果“将引用的程序集复制到工作区”设置设置为 true)。不幸的是,我无法让它在 VisualStudio 测试资源管理器中工作。
我的测试在开始后就崩溃了。我期望具有定义含义的特定 ExitCode 但我总是得到 -532462766。
我根据装配位置开始我的流程:
这是关于 DLL 的。系统日志确认文件丢失。
如果我捕获控制台,它会确认它与丢失的 DLL 有关。当然,在实际场景中,不会弹出控制台/表单/窗口,这只是简化的解决方案。
我已经检查了测试工具创建的给定临时位置,我注意到 *.exe 与 DLL 位于不同的子文件夹中。我猜 *.exe 不知道如何引用它们,因为它们不在通常的相对位置。 NCrunch 将所有文件保存在主临时目录中,这就是它工作的原因。
如何测试?我不想创建环境包装器来模拟它。我不想真正测试进程是否启动以及如果满足某些特定条件是否能够自行终止。
这是我的项目的超级简化版本:
主要项目(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);
}
}
}
您可以使用
process.StartInfo.FileName = Assembly.GetAssembly(typeof(ExternalProcess.Program)).CodeBase;
代替。
它对我有用。