代码之家  ›  专栏  ›  技术社区  ›  Chris Watts

向owin自托管webapi显式添加控制器

  •  0
  • Chris Watts  · 技术社区  · 8 年前

    我现在正在做一些单元测试,部分功能是调用一个api(它有点太多了,对工作太敏感,无法完全解释它在这里做什么……)。 本质上,api将接收请求,进行一些处理并将该请求转发给相关方。 我需要测试代码,抽象它是不可行的,因为它已经被很好地抽象了,但是有一些很难依赖于 HttpClient 我无法移除(在某个阶段,我将不得不称之为…)。

    我一直在使用owin testserver创建内存中的webapi服务器,

    请参见此处的StrathWeb: https://www.strathweb.com/2013/12/owin-memory-integration-testing/

    大卫·惠特尼: http://www.davidwhitney.co.uk/Blog/2015/01/07/testing-an-asp-net-webapi-app-in-memory/

    不知道: http://dontcodetired.com/blog/post/In-Process-Http-Server-for-Integration-Test-Faking-with-Owin-Katana-and-WebAPI

    我遇到的问题是,我创建的用于发出请求的webapi服务器将自动检测项目中的其他api,并针对该api运行请求,而不是使用单元测试/模拟控制器。

    我如何使用 HttpConfiguration 对象,用于 WebApp.Start<**Startup**>() 类只使用一个控制器?我是说这个班:

    internal class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();
            config.MapHttpAttributeRoutes();
            config.EnsureInitialized();
            config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
            app.UseWebApi(config);
        }
    }
    

    我不清楚如何解决这个问题,因为所有在线示例都讨论映射http路由,而不是删除/手动添加路由。

    如果你有问题/批评,请加上评论,我会尽我所能更新问题,我觉得我可能在我可以张贴的工作有限一点。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Chris Watts    8 年前

    我有一个解决方案,我认为一个整洁的…

    基于StrathWeb的博客: https://www.strathweb.com/2013/08/customizing-controller-discovery-in-asp-net-web-api/

    我已经实现了一个自定义 DefaultAssembliesResolver 它排除了包含导致这些问题的其他api控制器的程序集。

    自定义解析器:

    public class MyAssembliesResolver : DefaultAssembliesResolver
    {
        public override ICollection<Assembly> GetAssemblies()
        {
            ICollection<Assembly> baseAssemblies = base.GetAssemblies();
            List<Assembly> assemblies = new List<Assembly>(baseAssemblies.Where(x=>!x.FullName.Contains("<nameOfAssemblyToExclude>")));            
            return assemblies;
        }
    }
    

    然后替换启动类中的默认解析器:

    config.Services.Replace(typeof(IAssembliesResolver), new MyAssembliesResolver());
    

    这让我排除了额外的生产 ApiController (我正在尝试测试),仅包括 顶点控制器 用于内存owin管道中的单元测试。

    推荐文章