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
,但需要为其设置
区域设置,但无法设置。下面是我如何创建fake
HttpContext

    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(索引);
}
}
}