我已经看了很多例子,但在这种情况下,我希望能够重新审视下面这个方法,以便我可以对它进行单元测试。我正在使用带有moq的mstest,我知道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);
}
}
答案 0 :(得分:1)
你可以:
第一个解决方案:
通过参数将两个配置值传递给方法。这是一个好主意,取决于调用该方法的位置。它可能不是一个好主意设计,但它很容易测试(只需在测试中发送这些参数的硬编码值)。
第二个解决方案:
创建一个类来封装对这些资源的调用。某种配置代理。这个类有一个接口,并在构造函数中注入。这将使模拟和测试变得容易。它将为访问您的资源添加一个抽象。配置代理客户端不关心资源是否在Resx,.config,HttContext或其他任何内容中。
第三个解决方案:
让类的构造函数检索这些值并将它们分配给可在函数中使用的私有成员变量。与解决方案1类似,这将阻止调用代码了解这些配置值。要轻松测试,请使用第二个非默认构造函数,在构造函数中接收参数中的配置值。这样,如果您只是使用默认构造函数,ctor将调用ConfigurationManager等。但是在您的测试中,您可以调用第二个构造函数并传递这些值(这甚至需要模拟那些)。