主方法的C#单元测试 - 操作命令行参数 - Microsoft Visual Studio测试工具

时间:2014-12-22 12:36:30

标签: c# visual-studio-2010 unit-testing

使用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()处理它们?

2 个答案:

答案 0 :(得分:2)

注意:这是糟糕的设计MainProcessor(或其main方法)应该从Main个参数传递(例如,通过构造函数)参数。

但是,如果您能够切换到2013版本,则可以在Visual Studio中使用Fakes

  1. 在您的单元测试项目中,从参考,右键单击System并选择添加假装配
  2. 在将要创建的新文件mscorlib.fakes中,添加Fakes部分:

    <ShimGeneration>
      <Add FullName="System.Environment"/>
    </ShimGeneration>
    
  3. 重建

  4. 在测试中,您可以存根Environment静态方法调用:

    [TestMethod]
    public void TestSomeMethod()
    {
        using (ShimsContext.Create())
        {
            ShimEnvironment.GetCommandLineArgs = () => new string[] { "arg1", "arg2" };
    
            // Your test here.
         }
    }
    
  5. 您也可以查看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”的标准处理是神秘地停止工作,那么你就会遇到更大的问题......我们都会这样做。