如何使用 NSubstitute 模拟服务器变量
How to mock Server Variables using NSubstitute
我有以下获取用户IP地址的方法:
public string GetUserIpAddress(HttpContext context)
{
var ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!string.IsNullOrEmpty(ipAddress))
{
string[] addresses = ipAddress.Split(',');
if (addresses.Length != 0)
{
return addresses[0];
}
}
return context.Request.ServerVariables["REMOTE_ADDR"];
}
我正在尝试为此编写一个单元测试,但很难做到(使用 NSubstitute 和 NUnit)。我已经阅读了其他文章,到目前为止这是我的尝试:
var request = Substitute.For<HttpRequestBase>();
request.ServerVariables.Returns(new System.Collections.Specialized.NameValueCollection
{
{ "HTTP_X_FORWARDED_FOR", "value here" }
});
var httpContext = Substitute.For<HttpContextBase>();
httpContext.Request.Returns(request);
var helper = new UserIpAddressHelper();
var result = helper.GetUserIpAddress(httpContext.ApplicationInstance.Context);
错误是当我希望使用上面的服务器变量正确配置结果时,结果返回 null。
HttpRequestBase
专为可测试而创建,因为它是抽象的,因此可以被模拟框架覆盖。
如果您希望 GetUserIpAddress
可测试,请让它接受一个 HttpContextBase
实例:
public string GetUserIpAddress(HttpContextBase context)
如果需要从使用可以包装的 HttpContext
的代码中调用它:
HttpContext context;
var ipAddress = GetUserIpAddress(new HttpContextWrapper(context));
我有以下获取用户IP地址的方法:
public string GetUserIpAddress(HttpContext context)
{
var ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!string.IsNullOrEmpty(ipAddress))
{
string[] addresses = ipAddress.Split(',');
if (addresses.Length != 0)
{
return addresses[0];
}
}
return context.Request.ServerVariables["REMOTE_ADDR"];
}
我正在尝试为此编写一个单元测试,但很难做到(使用 NSubstitute 和 NUnit)。我已经阅读了其他文章,到目前为止这是我的尝试:
var request = Substitute.For<HttpRequestBase>();
request.ServerVariables.Returns(new System.Collections.Specialized.NameValueCollection
{
{ "HTTP_X_FORWARDED_FOR", "value here" }
});
var httpContext = Substitute.For<HttpContextBase>();
httpContext.Request.Returns(request);
var helper = new UserIpAddressHelper();
var result = helper.GetUserIpAddress(httpContext.ApplicationInstance.Context);
错误是当我希望使用上面的服务器变量正确配置结果时,结果返回 null。
HttpRequestBase
专为可测试而创建,因为它是抽象的,因此可以被模拟框架覆盖。
如果您希望 GetUserIpAddress
可测试,请让它接受一个 HttpContextBase
实例:
public string GetUserIpAddress(HttpContextBase context)
如果需要从使用可以包装的 HttpContext
的代码中调用它:
HttpContext context;
var ipAddress = GetUserIpAddress(new HttpContextWrapper(context));