[英]mocking httpContext.Current Api controller unit test
我正在尝试使用Moq framework
模拟httpContext
来确保httContext.Current is not null
当请求来自单元测试时却不能真正使它工作。
完成google之后,我会按照以下步骤进行操作,因此不确定在向Api controller
发出后期调用之前要执行哪些步骤。
第1步
Add Moq package to project
第2步
using Moq;
第三步
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
var response = new Mock<HttpResponseBase>();
request.Setup(r => r.UrlReferrer).Returns(new Uri("http://tempuri.org/?ReturnUrl=%2f"));
response.Setup(r => r.Cookies).Returns(new HttpCookieCollection());
context.Setup(c => c.Request).Returns(request.Object);
context.Setup(c => c.Response).Returns(response.Object);
有人可以在提出后期控制器请求之前帮我解决下一步需要做的事情。
在您的情况下,编写集成测试可能会容易得多。
[Test]
public async Task get_should_succeed()
{
//arrange
var url = string.Format("{0}{1}", BaseUrl, "controller");
using(var httpServer = CreateHttpServer())
using (var client = CreateHttpInvoker(httpServer))
{
using (var request = CreateHttpRequest(HttpMethod.Get, url))
//act
using (var response = await client.SendAsync(request, CancellationToken.None))
{
//assert
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
}
}
}
ControllerTestBase的简化版本:
public abstract class ControllerTestBase
{
protected ControllerTestBase()
{
BaseUrl = "http://localhost/api/";
}
public string BaseUrl { get; set; }
public static HttpServer CreateHttpServer()
{
var httpConfiguration = WebApiConfig.Register();
return new HttpServer(httpConfiguration);
}
public static HttpMessageInvoker CreateHttpInvoker(HttpServer httpServer)
{
return new HttpMessageInvoker(httpServer);
}
public HttpRequestMessage CreateHttpRequest(HttpMethod httpMethod, string url)
{
return new HttpRequestMessage(httpMethod, url);
}
}
首先,不要使用HttpContext.Current
,因为它不支持单元测试。 在Controller
有Request
和Response
属性,可用于访问有关Request或Response的任何信息。 使用它们而不是HttpContex.Current
。
在单元测试中,您可以设置自己的ControllerContext
。 请查看另一个stackoverflow问题,该问题描述了如何在Web Api中伪造ControllerContext
:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.