GVKun编程网logo

c# – 如何在FakeHttpContext中设置Request.Header以进行单元测试(c# 发起http请求)

16

关于c#–如何在FakeHttpContext中设置Request.Header以进行单元测试和c#发起http请求的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于.netHttpCont

关于c# – 如何在FakeHttpContext中设置Request.Header以进行单元测试c# 发起http请求的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于.net HttpContext.Current.Request.RawUrl、.net – HttpContext.Request和Request之间的区别、.net – 如何使单元测试可以使用HttpContext?、asp.net – HttpContext.Current.Request.IsAuthenticated和HttpContext.Current.User.Identity.IsAuthenticated有什么区别?等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

c# – 如何在FakeHttpContext中设置Request.Header以进行单元测试(c# 发起http请求)

c# – 如何在FakeHttpContext中设置Request.Header以进行单元测试(c# 发起http请求)

我有一个FakeHttpContext我一直在尝试修改以包含一些标题用于测试目的
public static HttpContext FakeHttpContext()
{
    var httpRequest = new HttpRequest("","http://stackoverflow/","");
    var stringWriter = new StringWriter();
    var httpResponse = new HttpResponse(stringWriter);
    var httpContext = new HttpContext(httpRequest,httpResponse);   

    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;
 }

这可以在没有标题的情况下工作,但是当我在httpRequest和stringWriter行之间添加任何这些代码行时.

httpRequest.Headers.Add("blah","1234");
    httpRequest.Headers["blah"] = "1234";

它抛出

An exception of type ‘System.PlatformNotSupportedException’ occurred
in System.Web.dll but was not handled in user code

>为什么我得到那个例外?
>是否有可能的方法将标头添加到HttpContext进行测试
WebApi控制器?

解决方法

我刚刚发现,使用HttpRequestMessage类,您可以轻松添加标头以测试WebAPI控制器,而无需创建任何假的HttpContext.
var request = new HttpRequestMessage(HttpMethod.Get,"http://stackoverflow");
request.Headers.Add("deviceid","1234");
_myController.Request = request;

.net HttpContext.Current.Request.RawUrl

.net HttpContext.Current.Request.RawUrl

.net  HttpContext.Current.Request.RawUrl   获取当前请求的原始URL  是什么意思
什么是原始URL,取得的值是什么,在JAVA中该如何实现 请指教

.net – HttpContext.Request和Request之间的区别

.net – HttpContext.Request和Request之间的区别

三个ASP.NET对象有什么区别?

> HttpContext.Current.Request
> HttpContext.Request
>请求

这些是完全一样的吗?

编辑1

在global.asax / global.asax.vb和default.aspx / default.aspx.vb中,这些对象的行为不同.

编辑2

好的,我会尝试这个具体的这个时间.我应该使用以下哪项?

' File: global.asax
Protected Sub Application_BeginRequest(ByVal sender As Object,ByVal e As System.EventArgs)
    If Request.Url.Port = 80 Then
    'If HttpContext.Current.Request.Url.Port = 80 Then
    'If HttpContext.Request.Url.Port = 80 Then
        'do something
    End If
End Sub

' File: default.aspx
Public Sub Page_Load(ByVal sender As Object,ByVal e As System.EventArgs)
    If Request.Url.Port = 80 Then
    'If HttpContext.Current.Request.Url.Port = 80 Then
    'If HttpContext.Request.Url.Port = 80 Then
        'do something
    End If
End Sub

解决方法

好:

> HttpContext.Current是返回线程当前的HttpContext的静态属性
> HttpContext.Request是一个返回HttpRequest的实例属性,用于您调用的HttpContext
> Page.Request是Page的一个实例属性,返回与您调用它的页面相关联的请求(通常是隐式的)

所以HttpContext.Current.Request将使用前两个属性来获取与当前线程关联的请求.如果您处于请求的线程中,那将与正在呈现的相关页面中的Page.Request相同.

但是,如果您的渲染开始不同的线程,则在另一个线程中运行的代码仍然可以通过Page.Request获取请求(因为它只是一个普通属性),但是没有与线程相关联的HttpContext – 所以HttpContext .Current.Request不行.

编辑:要回答编辑的问题,在global.asax中,Request属性是指HttpApplication.Request,可能是最好的方法. HttpContext.Request将不起作用,因为它试图访问静态属性,就像它是一个实例属性一样. HttpContext.Current.Request应该工作,假设上下文已经与线程相关联了.

.net – 如何使单元测试可以使用HttpContext?

.net – 如何使单元测试可以使用HttpContext?

我想编写一个单元测试来测试一个名为UploadedFile的类的功能.

我面临的问题是这个类的静态构造函数使用HttpContext.Current属性,因为我从类库运行我的单元测试,我在测试时没有HttpContext.

看看我的静态构造函数:

static UploadedFile()
{
    if (HttpContext.Current == null)
        throw new Exception("web server not available");

    HttpServerUtility server = HttpContext.Current.Server;

    // SET UploadedFileMappingFile Names:
    _resourceFileNames = new StringDictionary();

    _resourceFileNames[_suppoertedFileStructures] = server.MapPath(SupportedUploadedFileStructures);
    _resourceFileNames[_supportedFileStructuresXSD] = server.MapPath(SupportedUploadedFileStructuresXSD);

    _resourceFileNames[UploadedFileEnum.UploadedFileFormatENUM.CSV.ToString()] = server.MapPath(UploadedFileColumnMap);        
}

我应该在我的测试环境中做什么,以便HttpContext.Current不会为null,我可以成功设置它:

HttpServerUtility server = HttpContext.Current.Server;

解决方法

你不应该在你的函数中直接使用HttpContext.Current,因为你几乎不可能进行单元测试,正如你已经发现的那样.我建议你改用 HttpContextBase,它可以在你的类的构造函数中传递,也可以作为你正在测试的方法的参数传递.这将允许此类的消费者传递真正的 HttpContextWrapper,并且在您的单元测试中,您可以模拟您需要的方法.

例如,您可以调用该方法:

var wrapper = new HttpContextwrapper(HttpContext.Current);
Foo.UploadedFile(wrapper);

在您的单元测试中(使用Rhino Mocks):

var contextMock = MockRepository.GenerateMock<HttpContextBase>();
// Todo: Define expectations on the mocked object
Foo.UploadedFile(contextMock);

或者,如果您愿意,请使用Constructor Injection.

asp.net – HttpContext.Current.Request.IsAuthenticated和HttpContext.Current.User.Identity.IsAuthenticated有什么区别?

asp.net – HttpContext.Current.Request.IsAuthenticated和HttpContext.Current.User.Identity.IsAuthenticated有什么区别?

HttpContext.Current.Request.IsAuthenticated和HttpContext.Current.User.Identity.IsAuthenticated有什么区别?

你会在哪种情况下使用哪一个?

解决方法

没有什么区别。检查HttpContext.Current.Request.IsAuthenticated实现:
public bool IsAuthenticated
{
    get
    {
        return (((this._context.User != null) && 
                 (this._context.User.Identity != null)) &&
                 this._context.User.Identity.IsAuthenticated);
    }
}

今天关于c# – 如何在FakeHttpContext中设置Request.Header以进行单元测试c# 发起http请求的介绍到此结束,谢谢您的阅读,有关.net HttpContext.Current.Request.RawUrl、.net – HttpContext.Request和Request之间的区别、.net – 如何使单元测试可以使用HttpContext?、asp.net – HttpContext.Current.Request.IsAuthenticated和HttpContext.Current.User.Identity.IsAuthenticated有什么区别?等更多相关知识的信息可以在本站进行查询。

本文标签: