繁体   English   中英

模拟httpContext.Current Api控制器单元测试

[英]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 ,因为它不支持单元测试。 ControllerRequestResponse属性,可用于访问有关Request或Response的任何信息。 使用它们而不是HttpContex.Current

在单元测试中,您可以设置自己的ControllerContext 请查看另一个stackoverflow问题,该问题描述了如何在Web Api中伪造ControllerContext

测试使用HttpContext.Current.Request.Files的Web API方法?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM