У меня есть механизм, позволяющий завершить процесс в некоторых случаях. Для *.exe требуется *.dll. Все работает нормально в производстве и в NCrunch (если для параметра «Копировать ссылочные сборки в рабочую область» установлено значение true). К сожалению, я не могу заставить его работать в обозревателе тестов VisualStudio.
Мой тест вылетает сразу после запуска. Я ожидаю определенного кода выхода с определенным значением, но всегда получаю -532462766.
Я начинаю свои процессы в зависимости от местоположения сборки:
Речь идет о DLL. Системные журналы подтверждают отсутствие файлов.
Если я захватываю консоль, это подтверждает, что речь идет об отсутствующих DLL. Конечно, в реальном сценарии консоль/форма/окна не появляются, это просто упрощенное решение.
Я проверил заданное временное местоположение, созданное с помощью тестового инструмента, и заметил, что *.exe находится в другой подпапке, чем DLL. Я думаю, *.exe не знает, как ссылаться на них, поскольку они не находятся в своем обычном относительном расположении. NCrunch хранит все файлы в основном временном каталоге, поэтому он работает.
Как я могу это проверить? Я не хочу создавать оболочку Environment, чтобы издеваться над ней. Я не хочу по-настоящему проверять, запускается ли процесс и может ли он завершиться при выполнении некоторых определенных условий.
Вот суперупрощенная версия моего проекта:
Основной проект (Внешний процесс)
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);
}
}
}
Да, тестовый проект содержит ссылки как на «ExternalProcess», так и на «ExternalProcess.CommonCode». В реальном проекте тестовый проект — 4.7.2, остальные проекты — 4.0, в упрощенной версии все — 4.7.2. Я не могу предоставить реальный проект, но создал упрощенную версию с той же проблемой: file.io/9mGpMoGCWzJg





Вы можете использовать
process.StartInfo.FileName = Assembly.GetAssembly(typeof(ExternalProcess.Program)).CodeBase;
вместо. Меня устраивает.
Работает, спасибо ОГРОМНОЕ. Для других людей, ищущих какое-то объяснение: в моем случае нет разницы между «Местоположением» и «CodeBase» в NCrunch. Однако в VisualStudio Test Explorer "CodeBase" есть ссылка на реальный проект (в моем случае диск "D:\"). Это безопасно, поскольку проект собирается непосредственно перед запуском теста, поэтому вы можете быть уверены, что это не какая-то старая сборка. «Местоположение» указывает на местоположение в %TEMP%.
Я не могу воспроизвести вашу проблему. Какая версия .NET? Вы добавили ссылку на проект в свой тестовый проект?