使用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()处理它们?
答案 0 :(得分:2)
注意:这是糟糕的设计。 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.
}
}
您也可以查看at this article。
关于Visual Studio 2010,您可以使用名为Moles的Fakes前身,它与上面的非常类似。只需从 Extension Manager 添加 Visual Studio 2010 Moles 即可。我相信Moles会:
[TestMethod]
public void TestSomeMethod()
{
using (MolesContext.Create())
{
Moles.MEnvironment.GetCommandLineArgs = () => new string[] { "arg1", "arg2" };
// Your test here.
}
}
答案 1 :(得分:1)
不是从环境中提取命令行参数,为什么不将它们作为Main的参数?
static void Main(string[] args)
{
}
现在也将这些参数传递给MainProcessor的构造函数。
static void Main(string[] args)
{
var processor = new MainProcessor(args);
processor.main();
}
如果这是您的所有Main方法,那么您可以将测试重点放在MainProcessor上。你也可以调用Program.Main,传入你想要的任何东西,但是你可以观察到的唯一的事情是抛出异常,它作为测试并不是非常有用。
如果出于某种原因,“args”的标准处理是神秘地停止工作,那么你就会遇到更大的问题......我们都会这样做。