2011-11-28 52 views
1

我已经看了很多例子,但在这种情况下,我希望得到一个新的眼睛重构下面的这个方法,以便我可以单元测试它。我使用mstest与moq和我知道appsettings是一个问题,随着HttpContext被密封.... 任何帮助或想法(建设性)非常感激。寻找重构Appsettings和HttpContext的单元测试和moq

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); 
     } 
    } 

回答

1

,你可以:

解决方案一:

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

解决方法二:

创建一个类来封装这些资源的调用。某种配置代理。这个类将有一个接口并被注入到构造函数中。这样可以很容易地进行模拟和测试。它将添加一个抽象来访问您的资源。配置代理客户端不会在乎资源是否位于Resx,.config,HttContext或其他任何地方。

解决方案三:

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

+0

感谢您使用3种解决方案进行响应。 –