首页 文章

ASP.NET MVC5 Web API 2,OWIN和Autofac的集成测试出错 . 假HttpContext

提问于
浏览
0

我有ASP.NET MVC5和WebApi2应用程序与一些MVC和ApiControllers . 使用OWIN和Autofac . 我编写了集成测试,它调用了一些web api方法并测试了一个响应:

[TestMethod]
public async Task GetUsersForTreeTest()
{
  using (var server = TestServer.Create<Startup>())
  using (var client = new HttpClient(server.Handler))
  {
    client.BaseAddress = new Uri("http://localhost/api/");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    var resp = await client.GetAsync("User/GetUsersForTree");
    resp.EnsureSuccessStatusCode();
    var users = await resp.Content.ReadAsAsync<List<UserForTreeDto>>();
    Assert.IsTrue(users.Any());
  }
}

Startup是我的OWIN启动类 . 我使用Autofac初始化MVC和WebApi的依赖项解析器 .

当我运行测试时,我得到一个例外:

System.ArgumentNullException:值不能为null . 参数名称:httpContext结果StackTrace:位于Owin.AutofacMvcAppBuilderExtensions的System.Web.HttpContextWrapper..ctor(HttpContext httpContext) . <> c . < . cctor> b__2_0()at Owin.AutofacMvcAppBuilderExtensions . <> c . <b__1_0> d . 的MoveNext()

但是当我发表评论时

app.UseAutofacMvc();

测试通过了 . 据我了解,错误发生在AutofacMvcAppBuilderExtensions类的this line中 .

看起来像HttpContext.Current是null .

如何初始化HttpContext?

1 回答

  • 0

    以下代码适用于我:

    private static HttpContext GetFakeHttpContext()
    {
      var httpRequest = new HttpRequest("", "http://fakeUrl/", "");
      var stringWriter = new StringWriter();
      var httpResponce = new HttpResponse(stringWriter);
      var httpContext = new HttpContext(httpRequest, httpResponce);
      return httpContext;
    }
    
    [TestMethod]
    public async Task GetUsersForTreeTest()
    {
      var server = TestServer.Create(app =>
      {
        app.Use(async (context, next) =>
        {
          HttpContext.Current = GetFakeHttpContext();
          await next();
        });
        new Startup().Configuration(app);
      });
      using (server)
      using (var client = new HttpClient(server.Handler))
      {
        client.BaseAddress = new Uri("http://localhost/api/");
    
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        var resp = await client.GetAsync("User/GetUsersForTree");
        resp.EnsureSuccessStatusCode();
        var users = await resp.Content.ReadAsAsync<List<UserForTreeDto>>();
        Assert.IsTrue(users.Any());
      }
    }
    

相关问题