Unit testing 正在为单元测试和moq重构Appsettings和HttpContext
我已经看了很多例子,但是在本例中,我希望在下面的重构方法上有一个新的视角,这样我就可以对它进行单元测试了。我将mstest与moq一起使用,我知道appsettings是一个问题,HttpContext也被密封了。。。。 非常感谢任何帮助或想法(建设性的)Unit testing 正在为单元测试和moq重构Appsettings和HttpContext,unit-testing,refactoring,moq,mstest,Unit Testing,Refactoring,Moq,Mstest,我已经看了很多例子,但是在本例中,我希望在下面的重构方法上有一个新的视角,这样我就可以对它进行单元测试了。我将mstest与moq一起使用,我知道appsettings是一个问题,HttpContext也被密封了。。。。 非常感谢任何帮助或想法(建设性的) public void DoClaimSearch(SearchClaimInfo clmRequest) { var result = claimManager.ClaimSearch(clmRequest);
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);
}
}
你可以:
第一个解决方案:
通过参数将两个配置值传递给方法。这是否是一个好主意取决于该方法的调用位置。从设计角度来看,这可能不是一个好主意,但它将非常容易测试(只需在测试中发送这些参数的硬编码值)
第二种解决方案:
创建一个类来封装对这些资源的调用。某种配置代理。这个类将有一个接口并被注入构造函数中。这将使模拟和测试变得容易。它将为访问您的资源添加一个抽象。配置代理客户端将不关心资源是否位于Resx、.config、HttContext或任何其他文件中
第三种解决方案:
让类的构造函数检索这些值,并将它们分配给可以在函数中使用的私有成员变量。与解决方案1类似,这将阻止调用代码了解这些配置值。要轻松测试这一点,请使用第二个非默认构造函数来接收参数中的配置值。这样,如果您只使用默认构造函数,那么ctor将调用ConfigurationManager等。但是在测试中,您可以调用第二个构造函数并传入这些值(这甚至需要模拟这些值)。您可以:
第一个解决方案:
通过参数将两个配置值传递给方法。这是否是一个好主意取决于该方法的调用位置。从设计角度来看,这可能不是一个好主意,但它将非常容易测试(只需在测试中发送这些参数的硬编码值)
第二种解决方案:
创建一个类来封装对这些资源的调用。某种配置代理。这个类将有一个接口并被注入构造函数中。这将使模拟和测试变得容易。它将为访问您的资源添加一个抽象。配置代理客户端将不关心资源是否位于Resx、.config、HttContext或任何其他文件中
第三种解决方案:
让类的构造函数检索这些值,并将它们分配给可以在函数中使用的私有成员变量。与解决方案1类似,这将阻止调用代码了解这些配置值。要轻松测试这一点,请使用第二个非默认构造函数来接收参数中的配置值。这样,如果您只使用默认构造函数,则ctor将调用ConfigurationManager等。但在测试中,您可以调用第二个构造函数并传入这些值(这甚至需要模拟这些值)。感谢您使用3个解决方案进行响应。感谢您使用3个解决方案进行响应。