C# 为假HttpContext设置假区域设置
我正在对一些代码进行单元测试,这些代码在不同的地区表现不同。我创建了一个假的C# 为假HttpContext设置假区域设置,c#,asp.net-mvc,unit-testing,C#,Asp.net Mvc,Unit Testing,我正在对一些代码进行单元测试,这些代码在不同的地区表现不同。我创建了一个假的HttpContext,但需要为其设置区域设置,但无法设置。下面是我如何创建fakeHttpContext: public static HttpContext FakeHttpContext(string requestUrl) { var httpRequest = new HttpRequest("", requestUrl, ""); var stringWrite
HttpContext
,但需要为其设置区域设置,但无法设置。下面是我如何创建fakeHttpContext
:
public static HttpContext FakeHttpContext(string requestUrl)
{
var httpRequest = new HttpRequest("", requestUrl, "");
var stringWriter = new StringWriter();
var httpResponce = new HttpResponse(stringWriter);
var httpContext = new HttpContext(httpRequest, httpResponce);
var sessionContainer = new HttpSessionStateContainer("id", new SessionStateItemCollection(),
new HttpStaticObjectsCollection(), 10, true,
HttpCookieMode.AutoDetect,
SessionStateMode.InProc, false);
httpContext.Items["AspSession"] = typeof(HttpSessionState).GetConstructor(
BindingFlags.NonPublic | BindingFlags.Instance,
null, CallingConventions.Standard,
new[] { typeof(HttpSessionStateContainer) },
null)
.Invoke(new object[] { sessionContainer });
return httpContext;
}
不久前,我不得不为更好的单元测试提供一些服务。我能够使用HttpContextBase和HttpContextWrapper实现这一点。你看过这些吗?我似乎记得他们帮了我很多
这里至少有一篇文章在谈论它。
您不需要模拟HttpContext。可以使用Thread.CurrentThread.CurrentCulture
属性更改区域性:
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
这里已经讨论了这一点:
最终解决了:
/// <summary>
/// Fake HTTPCONTEXT generator
/// </summary>
/// <param name="extention">Http context extention</param>
/// <param name="domain">Http context domain</param>
/// <param name="locale">Http context locale</param>
/// <returns>Fake Http Context</returns>
private static HttpContext FakeHttpContext(string extention, string domain, string locale = "en-US,en;q=0.8")
{
HttpWorkerRequest httpWorkerRequest = new SimpleWorkerRequestHelper(false, domain, extention, locale);
return new HttpContext(httpWorkerRequest);
}
//
///伪HTTPCONTEXT生成器
///
///Http上下文扩展
///Http上下文域
///Http上下文区域设置
///伪造Http上下文
私有静态HttpContext FakeHttpContext(字符串扩展,字符串域,字符串区域设置=“en-US,en;q=0.8”)
{
HttpWorkerRequest HttpWorkerRequest=新的SimpleWorkerRequestHelper(false、domain、Extension、locale);
返回新的HttpContext(httpWorkerRequest);
}
SimpleWorkerRequestHelper的代码:
public class SimpleWorkerRequestHelper : SimpleWorkerRequest
{
/// <summary>
/// Whether the request is secure
/// </summary>
private string _domain;
/// <summary>
/// Whether the request is secure
/// </summary>
private string _locale;
/// <summary>
/// Initializes a new instance of the <see cref="SimpleWorkerRequestHelper" /> class.
/// </summary>
/// <param name="isSecure">Whether the helper request should be secure</param>
public SimpleWorkerRequestHelper(bool isSecure, string domain = "", string extention = "/", string locale = "")
: base(extention, AppDomain.CurrentDomain.BaseDirectory, string.Empty, string.Empty, new StringWriter())
{
_domain = domain;
_locale = locale;
}
/// <devdoc>
/// <para>[To be supplied.]</para>
/// </devdoc>
public override String GetRemoteAddress()
{
if (string.IsNullOrEmpty(this._domain))
{
return base.GetRemoteAddress();
}
else
{
return this._domain;
}
}
/// <devdoc>
/// <para>[To be supplied.]</para>
/// </devdoc>
public override String GetLocalAddress()
{
if (string.IsNullOrEmpty(this._domain))
{
return base.GetLocalAddress();
}
else
{
return this._domain;
}
}
/// <summary>
/// Overriding "GetKnownRequestHeader" in order to force "SimpleWorkerRequest" to return the fake value for locale needed for unit testing.
/// </summary>
/// <param name="index">Index associated with HeaderAcceptLanguage in lower level library</param>
/// <returns>The language or the value from base dll</returns>
public override string GetKnownRequestHeader(int index)
{
if (index == HttpWorkerRequest.HeaderAcceptLanguage && !string.IsNullOrEmpty(_locale))
{
return _locale;
}
else
{
return base.GetKnownRequestHeader(index);
}
}
}
公共类SimpleWorkerRequest密码:SimpleWorkerRequest
{
///
///请求是否安全
///
私有字符串_域;
///
///请求是否安全
///
私有字符串_locale;
///
///初始化类的新实例。
///
///助手请求是否应该是安全的
公共SimpleWorkerRequestHelper(布尔值是安全的,字符串域=”,字符串扩展=“/”,字符串区域设置=”)
:base(扩展名,AppDomain.CurrentDomain.BaseDirectory,string.Empty,string.Empty,new StringWriter())
{
_域=域;
_语言环境=语言环境;
}
///
///[待提供。]
///
公共重写字符串GetRemoteAddress()
{
if(string.IsNullOrEmpty(此._域))
{
返回base.GetRemoteAddress();
}
其他的
{
返回此.\u域;
}
}
///
///[待提供。]
///
公共重写字符串GetLocalAddress()
{
if(string.IsNullOrEmpty(此._域))
{
返回base.GetLocalAddress();
}
其他的
{
返回此.\u域;
}
}
///
///重写“GetKnownRequestHeader”,以强制“SimpleWorkerRequest”为单元测试所需的区域设置返回假值。
///
///与低级库中HeaderAcceptLanguage关联的索引
///基本dll中的语言或值
公共重写字符串GetKnownRequestHeader(整数索引)
{
if(index==HttpWorkerRequest.HeaderAcceptLanguage&&!string.IsNullOrEmpty(_locale))
{
返回语言环境;
}
其他的
{
返回base.GetKnownRequestHeader(索引);
}
}
}