如何在 FakeHttpContext 中设置 Request.Header 进行单元测试
How to setup Request.Header in FakeHttpContext for Unit Testing
我有一个 FakeHttpContext 我一直在尝试修改以包含一些 headers 用于测试目的
public static HttpContext FakeHttpContext()
{
var httpRequest = new HttpRequest("", "http://Whosebug/", "");
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;
}
这在没有 headers 的情况下有效,但是当我在 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
- 为什么我得到那个异常?
- 有没有办法将headers添加到HttpContext进行测试
WebApi 控制器?
我刚刚发现使用 HttpRequestMessage class,您可以轻松添加 headers 来测试您的 WebAPI 控制器 而不必创建任何 fake HttpContext.
var request = new HttpRequestMessage(HttpMethod.Get, "http://Whosebug");
request.Headers.Add("deviceId","1234");
_myController.Request = request;
我正在使用 .Net Core 3.1 和 Moq 框架。我创建了一个 DefaultHttpContext,在那里设置 headers,最后将它分配给控制器 ControllerContext 构造函数。
var httpContext = new DefaultHttpContext();
httpContext.Request.Headers["X-Example"] = "test-header";
var controller = new ExampleController(mockClient.Object, mockLogger.Object)
{
ControllerContext = new ControllerContext()
{
HttpContext = httpContext
}
};
来源:https://www.thecodebuzz.com/unit-test-mock-httprequest-in-asp-net-core-controller/
我有一个 FakeHttpContext 我一直在尝试修改以包含一些 headers 用于测试目的
public static HttpContext FakeHttpContext()
{
var httpRequest = new HttpRequest("", "http://Whosebug/", "");
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;
}
这在没有 headers 的情况下有效,但是当我在 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
- 为什么我得到那个异常?
- 有没有办法将headers添加到HttpContext进行测试 WebApi 控制器?
我刚刚发现使用 HttpRequestMessage class,您可以轻松添加 headers 来测试您的 WebAPI 控制器 而不必创建任何 fake HttpContext.
var request = new HttpRequestMessage(HttpMethod.Get, "http://Whosebug");
request.Headers.Add("deviceId","1234");
_myController.Request = request;
我正在使用 .Net Core 3.1 和 Moq 框架。我创建了一个 DefaultHttpContext,在那里设置 headers,最后将它分配给控制器 ControllerContext 构造函数。
var httpContext = new DefaultHttpContext();
httpContext.Request.Headers["X-Example"] = "test-header";
var controller = new ExampleController(mockClient.Object, mockLogger.Object)
{
ControllerContext = new ControllerContext()
{
HttpContext = httpContext
}
};
来源:https://www.thecodebuzz.com/unit-test-mock-httprequest-in-asp-net-core-controller/