【问题标题】:Looking to refactor Appsettings and HttpContext for unit test and moq希望为单元测试和起订量重构 Appsettings 和 HttpContext
【发布时间】:2011-11-28 21:20:31
【问题描述】:

我查看了很多示例,但在这种情况下,我希望重新审视以下重构此方法,以便我可以对其进行单元测试。我正在将 mstest 与 moq 一起使用,并且我知道 appsettings 是一个问题,以及 HttpContext 被密封...... 非常感谢任何帮助或想法(建设性的)。

   public void DoClaimSearch(SearchClaimInfo clmRequest)
    {
        var result = claimManager.ClaimSearch(clmRequest);
        if (result.RespMsg.TotalRowCount > Convert.ToInt32(ConfigurationManager.AppSettings.Get("TotalRowCount_Max_ClaimSearch")))
        {
            string ResKey = HttpContext.GetGlobalResourceObject("Global", "info_toomanyrecordsmatch.Text").ToString();
            ResKey = ResKey.Replace("{0}", result.RespMsg.TotalRowCount.ToString());
            View.AddNotification(WidgetNotificationType.Error,ResKey);
        }
        else
        {
            View.SetWidgetResponseData(result.RespMsg.SearchResults);
        }
    }

【问题讨论】:

    标签: unit-testing refactoring moq mstest


    【解决方案1】:

    你可以:

    第一个解决方案:

    通过参数将两个配置值传递给方法。这是否是一个好主意取决于调用该方法的位置。在设计方面可能不是一个好主意,但它很容易测试(只需在测试中为这些参数发送硬编码值)。

    第二种解决方案:

    创建一个类来封装对这些资源的调用。某种配置代理。这个类将有一个接口并被注入到构造函数中。这将使模拟和测试变得容易。它将添加一个抽象来访问您的资源。配置代理客户端不会关心资源是否在 Resx、.config、HttContext 或其他任何内容中。

    第三种解决方案:

    让类的构造函数检索这些值并将它们分配给可在您的函数中使用的私有成员变量。与解决方案 1 类似,这将阻止调用代码知道这些配置值。为了轻松测试这一点,请使用第二个非默认构造函数接收参数中的这些配置值。这样,如果您只是使用默认构造函数,ctor 将调用 ConfigurationManager 等。但在您的测试中,您可以调用第二个构造函数并将这些值传入(这甚至需要模拟这些值)。

    【讨论】:

    • 感谢您提供 3 个解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多