使用Visual Studio单元测试C#的命令行参数

6
我需要使用VS单元测试框架来确保所有代码都能正常运行,但我在让需要命令行参数的测试工作时遇到了很多困难(因为命令行输入必须在运行时给出,而在单元测试中不存在真正的“运行时”)。有没有办法在我的单元测试中使用命令行参数输入?我意识到这不是构建程序的理想方式,但不幸的是,我不能决定测试过程的工作方式。
我已经阅读了一些资料,发现我可能可以编写一个批处理文件并将其包含在MStest/testcontainer文件夹中。然而,在以这种方式处理之前,我必须先解决以下问题:
1)我对批处理文件一无所知
2)我不知道MStest/testcontainer文件夹在哪里、如何访问它、它的工作原理或者如何向其中添加文件(因为它似乎被隐藏或者不容易访问)
3)即使批处理文件正确编写并位于MStest/testcontainer文件夹中,我也不知道该怎么处理。我的测试如何知道它在那里,更何况从中获取输入?
总之,如何让VS单元测试接受命令行参数?如果我必须使用批处理文件方法,我希望您能向我解释得非常详细易懂。请原谅我的无知,但我在这个特定的上下文中找不到任何明确或有用的解释。
非常感谢!
2个回答

2

以下是关于it技术的翻译:

一个简短而不正确的单元测试方法是:如果您的程序需要命令行参数,则应该有一个static void Main(string[] args)方法。只需编写单元测试来调用此方法,并使用通常添加的任何命令行参数。

更好的方法是将功能拆分为两部分:一个执行工作的类和一个简单的程序,该程序获取命令行参数并将其传递给工作程序。然后编写两个单元测试:第一个测试Main(xxx)是否实际将参数传递给您的类,第二个测试您的实际工作程序根据这些参数的行为是否正确。


0

你可以使用Process类在测试方法中启动程序的新实例。例如:

Process prop = new Process();
prop.StartInfo.FileName = "myProgram.exe";
prop.StartInfo.Arguments = "-arg1 -arg2";
prop.StartInfo.RedirectStandardOutput = true;
prop.StartInfo.RedirectStandardInput = true;
prop.Start();
// You can then use prop.StandardInput and prop.StandardOutput for testing.
prop.WaitForExit();
int code = prop.ExitCode;

这看起来比整个批处理文件的胡言乱语要容易得多!Process在哪个命名空间下?另外,我该如何在我的测试中使用prop?例如,arg1是我需要访问的输入,我只需说:“prop.StandardInput.arg1”以访问arg1以在我的测试函数中使用吗? - Grant Ball
prop.StandardInput和prop.StandardOutput只是您可以向其中发送文本并从中读取的流。这基本上是程序的黑盒测试。这不会给予对特定方法/变量的访问权限。它只会测试在给定特定输入的情况下,是否获得了正确的输出。 - Cemafor
现在一切都运行顺畅了,多亏了你的帮助。非常感谢。 - Grant Ball

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接