Main 方法 - 操作命令行参数 - Microsoft Visual Studio 测试工具的 C# 单元测试
本文关键字:测试工具 Studio 单元测试 Visual 参数 操作 方法 操作命令 命令行 Main Microsoft | 更新日期: 2023-09-27 18:35:02
使用Visual studio,我正在为已经使用.Net framework 2.0编写的程序编写单元测试。除了 Main(应用程序的入口点(的测试外,所有常用的单元测试都工作正常。程序的 Main 方法在声明时没有任何 String[] 作为参数传递。程序在关联的对象中使用 Environment.getCommandLineArgs(( 处理命令行参数。主程序如下所示:
[STAThread]
static void Main()
{
MainProcessor StartProgram = new MainProcessor();
StartProgram.main();
StartProgram = null;
}
命令行参数在 main 中处理,如下所示:
public void main() {
String [] args = Environment.getCommandLineArgs();
// process arguments
}
有没有办法从测试方法中操作命令行参数并使用如上所述的 Environment.getCommandLineArgs(( 处理它们?
注意:这是设计不好。 MainProcessor
(或其main
方法(应该接受(例如,通过构造函数(从Main
参数传递的参数。
但是,如果您能够切换到版本 2013,您仍然可以从 Visual Studio 中使用Fakes
:
- 在单元测试项目中,从">引用">中右键单击"
System
"并选择">添加假货程序集
"> 在将要创建的新文件
mscorlib.fakes
中,在第Fakes
节中添加:<ShimGeneration> <Add FullName="System.Environment"/> </ShimGeneration>
重建
在测试中,可以存根
Environment
静态方法调用:[TestMethod] public void TestSomeMethod() { using (ShimsContext.Create()) { ShimEnvironment.GetCommandLineArgs = () => new string[] { "arg1", "arg2" }; // Your test here. } }
你也可以看看这篇文章。
关于Visual Studio 2010,你可以使用Fakes的前身Moles,它与上面的非常相似。只需从扩展管理器添加Visual Studio 2010 Moles即可。我相信在摩尔中,它将是:
[TestMethod]
public void TestSomeMethod()
{
using (MolesContext.Create())
{
Moles.MEnvironment.GetCommandLineArgs = () => new string[] { "arg1", "arg2" };
// Your test here.
}
}
与其从环境中提取命令行参数,为什么不将它们作为 Main 的参数呢?
static void Main(string[] args)
{
}
现在将这些参数也传递给主处理器的构造函数。
static void Main(string[] args)
{
var processor = new MainProcessor(args);
processor.main();
}
如果这就是您的 Main 方法所做的全部工作,那么您可以将测试重点放在 MainProcessor 上。你也可以只调用Program.Main,传入任何你想要的东西,但是由于你唯一可以观察的是是否抛出异常,所以它作为测试并不是很有用。
如果出于某种原因,"args"的标准处理神秘地停止工作,你就有更大的问题......我们都这样做。