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

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

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

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

  1. 在单元测试项目中,从">引用">中右键单击"System"并选择">添加假货程序集
  2. ">
  3. 在将要创建的新文件mscorlib.fakes中,在第 Fakes 节中添加:

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

  5. 在测试中,可以存根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"的标准处理神秘地停止工作,你就有更大的问题......我们都这样做。