Autofac OWIN TestServer和HttpContext

the*_*ing 3 asp.net integration-testing autofac asp.net-mvc-5 asp.net-web-api2

我正在尝试使用我的IIS托管WebAPI 2.2应用程序设置集成测试.我使用Autofac进行DI,我使用的是使用OWIN的新ASP.net Identity堆栈.我遇到了Autofac的问题,其中HttpContext类总是为null.以下是我如何设置我的基本集成测试类 -

 [TestClass]
public class TestBase
{
    private SimpleLifetimeScopeProvider _scopeProvider;
    private IDependencyResolver _originalResolver;
    private HttpConfiguration _configuration;
    public TestServer Server { get; private set; }

    [TestInitialize]
    public void Setup()
    {
        Server = TestServer.Create(app =>
        {
            //config webpai
            _configuration = new HttpConfiguration();
            WebApiConfig.Register(_configuration);

            // Build the container.
            var container = App_Start.IocConfig.RegisterDependencies(_configuration);
            _scopeProvider = new SimpleLifetimeScopeProvider(container);

            //set the mvc dep resolver
            var mvcResolver = new AutofacDependencyResolver(container, _scopeProvider);
            _originalResolver = DependencyResolver.Current;
            DependencyResolver.SetResolver(mvcResolver);

            //set the webapi dep resolvers
            _configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);

            app.UseAutofacMiddleware(container);
            app.UseAutofacWebApi(_configuration);
            app.UseAutofacMvc();
        });
    }

    [TestCleanup]
    public void Cleanup()
    {
        // Clean up the fake 'request' scope.
        _configuration.Dispose();
        DependencyResolver.SetResolver(_originalResolver);
        _scopeProvider.EndLifetimeScope();
        Server.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

当一个简单的测试开始时,我得到一个ArgumentNullException"Value not not null"httpContext.如果我追溯到autofac代码,我认为它来自这个扩展方法 -

 public static class AutofacMvcAppBuilderExtensions
    {
        internal static Func<HttpContextBase> CurrentHttpContext = () => new HttpContextWrapper(HttpContext.Current);

        /// <summary>
        /// Extends the Autofac lifetime scope added from the OWIN pipeline through to the MVC request lifetime scope.
        /// </summary>
        /// <param name="app">The application builder.</param>
        /// <returns>The application builder.</returns>
        [SecuritySafeCritical]
        [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]
        public static IAppBuilder UseAutofacMvc(this IAppBuilder app)
        {
            return app.Use(async (context, next) =>
            {
                var lifetimeScope = context.GetAutofacLifetimeScope();
                var httpContext = CurrentHttpContext();

                if (lifetimeScope != null && httpContext != null)
                    httpContext.Items[typeof(ILifetimeScope)] = lifetimeScope;

                await next();
            });
        }
    }
Run Code Online (Sandbox Code Playgroud)

Core/Source/Autofac.Integration.Mvc.Owin/AutofacMvcAppBuilderExtensions.cs文件中运行.我的设置是否有问题,或者在使用IIS主机和OWIN中间件的WebApi应用程序的集成测试中使用Autofac的正确方法是什么?

Tra*_*lig 7

您似乎已经在Autofac项目中将此问题作为一个问题.我会在这里复制/粘贴答案(虽然将来可能会更好地选择其中一个而不是两个).

OWIN专用应用程序的一部分功能是你不再需要HttpContext了.没有什么是与此相关的; 相反,它HttpContextBase是与遗留IIS分开的所有和事物.就像在Web API中一样,当前的上下文随处可见HttpRequestMessage- 没有全局静态,HttpContext.Current因为这是遗留的东西.

因此,当您使用OWIN测试主机运行单元测试时,您可以预期不存在HttpContext.Current.它与所有这一切脱钩了.

MVC不能仅作为OWIN运行,因为库与传统的IIS/ASP.NET堆栈紧密耦合.尝试使用仅OWIN测试服务器测试MVC内容会给你带来这样的麻烦.随着新的Visual Studio的出现,新的ASP.NET 5.0将会发生变化.

如果您需要以集成方式测试MVC,那么现在无法使用OWIN进行测试.你必须启动IIS Express.

最后,我确实看到你错过了OWIN(实际的Microsoft Web API中间件)的Web API中间件.这可能会给你带来其他问题.

app.UseAutofacMiddleware(container);
app.UseAutofacWebApi(_configuration);
app.UseAutofacMvc();
// You're missing this:
app.UseWebApi(config);
Run Code Online (Sandbox Code Playgroud)