将控制器显式添加到Owin自托管WebAPI

时间:2018-06-12 16:32:01

标签: c# asp.net-web-api owin self-hosting

我目前正在进行一些单元测试,部分功能是调用API(这有点太多而且太敏感,无法完全解释它在这里做了什么......)。 从本质上讲,API将接收请求,进行一些处理并将该请求转发给相关方。 我需要测试那些代码,抽象它是不可行的,因为它已经很好地抽象了,但是HttpClient有一些我无法删除的硬依赖(在某个阶段,我将不得不调用它。 )。

我一直在使用Owin TestServer来创建内存webapi服务器,

请参见Strathweb:https://www.strathweb.com/2013/12/owin-memory-integration-testing/

David Whitney:http://www.davidwhitney.co.uk/Blog/2015/01/07/testing-an-asp-net-webapi-app-in-memory/

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

我遇到的问题是,我创建用于发出请求的WebApi服务器将自动检测项目中的其他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 个答案:

答案 0 :(得分:1)

我有一个解决方案,我认为整整一个..

基于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(我正在尝试测试),并且仅包含我的ApiController用于内存Owin管道中的单元测试。