对包含不带参数的 Main 方法的控制台应用程序运行 MSTest 测试时,我收到 System.ArgumentException

问题描述 投票:0回答:1

我有一个用 C# 10 开发的基本控制台应用程序,它是为 .NET 6.0 设计的。该应用程序接收完整的文件路径作为输入,验证其存在,并向控制台记录一条消息,指示其是否存在。此外,我还有一个使用 MSTest 实现的单元测试项目,其中包含三个测试,涵盖了所有可能的场景和代码语句。但是,当我在 Visual Studio 2022 中或通过命令提示符执行测试时,每个测试都会遇到以下错误:“System.ArgumentException:未指定参数 --parentprocessid。”

这是主程序的代码。

class Program
{
    static void Main()
    {
        while (true)
        {
            Console.WriteLine("Enter a file path (or 'exit' to quit):");
            string? filePath = Console.ReadLine();

            if (filePath?.ToLower() == "exit")
                break;

            bool fileExists = File.Exists(filePath);
            if (fileExists)
            {
                Console.WriteLine("File exists.");
            }
            else
            {
                Console.WriteLine("File doesn't exist.");
            }
        }

        Console.WriteLine("Press any key to exit...");
        Console.ReadKey();
    }
}

这是单元测试的代码。

using Microsoft.VisualStudio.TestPlatform.TestHost;

namespace FileCheckTests
{
    [TestClass]
    public partial class UnitTests
    {
        [TestMethod]
        public void FileExists_ShouldPrintFileExists()
        {
            string filePath = Path.GetTempFileName();
            var consoleOutput = new ConsoleOutput();

            using (consoleOutput)
            {
                Console.SetIn(new StringReader(filePath));
                Program.Main(null);
            }

            string output = consoleOutput.GetOutput();
            Assert.IsTrue(output.Contains("File exists"));
        }

        [TestMethod]
        public void FileDoesNotExist_ShouldPrintFileDoesNotExist()
        {
            string filePath = "NonExistentFile.txt";
            var consoleOutput = new ConsoleOutput();

            using (consoleOutput)
            {
                Console.SetIn(new StringReader(filePath));
                Program.Main(null);
            }

            string output = consoleOutput.GetOutput();
            Assert.IsTrue(output.Contains("File doesn't exist"));
        }

        [TestMethod]
        public void ExitCommand_ShouldExitProgram()
        {
            string filePath = "exit";
            var consoleOutput = new ConsoleOutput();

            using (consoleOutput)
            {
                Console.SetIn(new StringReader(filePath));
                Program.Main(null);
            }

            string output = consoleOutput.GetOutput();
            Assert.IsFalse(output.Contains("File exists") || output.Contains("File doesn't exist"));
        }
    }
}

最后,这是单元测试用来处理控制台输出的类。

namespace FileCheckTests
{
    public partial class UnitTests
    {
        private class ConsoleOutput : IDisposable
        {
            private StringWriter stringWriter;
            private TextWriter originalOutput;

            public ConsoleOutput()
            {
                stringWriter = new StringWriter();
                originalOutput = Console.Out;
                Console.SetOut(stringWriter);
            }

            public string GetOutput()
            {
                return stringWriter.ToString();
            }

            public void Dispose()
            {
                Console.SetOut(originalOutput);
                stringWriter.Dispose();
            }
        }
    }
}

到目前为止,我已执行以下操作来尝试解决该异常:\

  1. 更新了 MSTest 框架和测试适配器。
  2. 重建解决方案。
  3. 清洁溶液。
  4. 重新启动 Visual Studio。
  5. 将默认的 string[] 参数添加回 Main 方法签名,并将一个空字符串数组传递到每个测试的 Program.Main() 调用中。
c# .net console-application mstest
1个回答
0
投票

问题是:您没有在测试项目中引用目标项目。

因此,

Program
将使用“Microsoft.VisualStudio.TestPlatform.TestHost”作为默认类定义。

将鼠标悬停到“程序”并查看它是什么。参考目标项目,问题应该消失。

© www.soinside.com 2019 - 2024. All rights reserved.