【问题标题】:unit testing a static Main() method in c#在 C# 中对静态 Main() 方法进行单元测试
【发布时间】:2015-05-14 04:13:15
【问题描述】:

我正在尝试使用 Visual Studio 单元测试框架为静态 Main 方法编写单元测试,这也是我的应用程序的入口点。我的方法如下。

public static void Main()
        {
            StructureMapBootstrapper.Register();
            SetupFilter<Applicant>();
        }

这会调用一个通用的 SetupFilter 方法

private static void SetupFilter<T>() where T : IDataFilterBase, new()
        {
            var filterName = typeof(T).Name;
            if ("StartReceiver".TryGetTrueOrFalseConfigValue(filterName))
            {
                ObjectFactory.Configure(x => x.For<IDataFilterBase>().Use<T>());
                var filter = new T();
                filter.StartReceiver();
                LogHelper.LogInfo(string.Format("Started {0} Filter Service", filterName));
            }
            else
            {
                LogHelper.LogInfo(string.Format("{0} Filter Service NOT started. StartReceiver flag is set to false", filterName));
            }
        }

我想到的第一件事是使用 MOQ 并验证 SetupFilter 方法至少被调用了一次,但编译器抱怨该方法是静态的。 关于如何为此方法编写测试的任何想法?如何使用 VS 单元测试框架进行设置,我需要断言什么?

【问题讨论】:

  • 您正在尝试对您的 IoC 容器进行单元测试?那个疯狂的字符串扩展方法是干什么用的?
  • 你打算如何对私有方法进行单元测试?
  • 恕我直言,您不应该对 Main 进行单元测试 - 您也许可以对 Main does 进行单元测试,但 true 单元测试需要您模拟 RegisterSetupFilter 方法,并验证 Main 调用这两个方法,这可能不是您想要做的。
  • IMO,对 Main 方法进行单元测试没有任何意义。通常,当您对一个方法进行单元测试时,您正在测试以下两件事之一:1. 它是返回值,或者 2. 它对应用程序的状态所做的一些事情。在这种情况下,您没有设置 Main 的返回值,并且状态随着 Main 的退出而消失。
  • 你现有的测试是什么样的?

标签: c# unit-testing vs-unit-testing-framework


【解决方案1】:

在我看来你必须对你的代码做一个小的重构:

public class MyClass
{
    public static void Main()   
    {
       (new MyClass()).run();
    }
    public void Run()
    {
        StructureMapBootstrapper.Register();
        SetupFilter<Applicant>();
    }
}

然后你可以测试普通方法而不是static

【讨论】:

  • 我相信 ops 问题实际上与 SetupFilter 是静态的......不是主要的有关。你解决了错误的问题。
猜你喜欢
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 2022-01-02
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
相关资源
最近更新 更多