测试期间HttpContext.Current为null

时间:2016-09-21 08:39:55

标签: c# asp.net unit-testing asp.net-web-api

我有一个.NET C#Web API应用程序。我有一个url控制器端点,它接收POST消息。当我运行应用程序并使用外部工具发送POST消息时,它完全正常。

但是,当我从单元测试中触发控制器时,我得到一个空引用。异常因为某些原因HttpContext.Current是null

这是我当前的控制器(在真实情况下工作):

    [HttpPost]
    public async Task<IHttpActionResult> Post()
    {
            await Request.Content.ReadAsStringAsync();

            if (Request.Content.IsFormData())
            {
                var stuff = HttpContext.Current.Request["stuff"];
            }

            return Ok();
        }
    }

这是我的单元测试文件:

[TestFixture]
public class AnnotationsControllerTest : BaseIntegrationTest
{
    private const string Uri = "http://localhost:2622/api/annotations";

    [Test]
    public async void TestHistoriesPost()
    {
        var form = new List<KeyValuePair<string, string>>();
        form.Add(new KeyValuePair<string, string>("stuff", "123456"));

        using (var request = new HttpRequestMessage(HttpMethod.Post, Uri))
        using (var config = new HttpConfiguration())
        {
            var route = config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}");
            using (var content = new FormUrlEncodedContent(form))
            {
                request.Content = content;
                var mockDataService = GetDataServices();
                var controller = new AnnotationsController(mockDataService.Object, ApiTestConfiguration());
                SetupController(route, controller, config, request);

                var actionResult = await controller.Post();
                var httpResponseMessage = await actionResult.ExecuteAsync(CancellationToken.None);
                Assert.AreEqual(HttpStatusCode.OK, httpResponseMessage.StatusCode);
            }
        }
    }

    private static void SetupController(
        IHttpRoute route,
        ApiController controller,
        HttpConfiguration configuration,
        HttpRequestMessage request)
    {
        var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "controller", "Annotations" } });
        controller.ControllerContext = new HttpControllerContext(configuration, routeData, request);
        configuration.Services.Replace(typeof(IExceptionHandler), new UnhandledExceptionHandler());
        controller.Request = request;
        controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = configuration;
    }

    private Mock<IDataServices> GetDataServices()
    {
        return new Mock<IDataServices>();
    }
}

0 个答案:

没有答案