将控制器显式添加到 Owin 自托管 WebAPI
Adding a controller explicitly to Owin self hosted WebAPI
我目前正在做一些单元测试,部分功能是调用 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/
和 DontCodeTired:http://dontcodetired.com/blog/post/In-Process-Http-Server-for-Integration-Test-Faking-with-Owin-Katana-and-WebAPI
我遇到的问题是,我正在创建用于发出请求的 WebApi 服务器将自动检测项目中的其他 API 和针对该请求的 运行,而不是使用我的装置 test/mock 控制器。
如何使用 HttpConfiguration
对象,在 WebApp.Start<**Startup**>()
class 中只使用一个控制器?我的意思是 class:
internal class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
config.EnsureInitialized();
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
app.UseWebApi(config);
}
}
我不清楚如何解决这个问题,因为所有在线示例都在讨论映射 HTTP 路由,而不是 removing/manually 添加路由。
如果您有 questions/criticisms 请添加评论,我会尽我所能更新问题,我觉得由于工作原因我可能 post 会受到一些限制。
我有一个解决方案,我认为一个整洁的..
基于 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;
}
}
然后替换启动中的默认解析器class:
config.Services.Replace(typeof(IAssembliesResolver), new MyAssembliesResolver());
这允许我排除额外的生产 ApiController
(我正在尝试测试),并且只包括我的 ApiController
用于内存 Owin 管道中的单元测试。
我目前正在做一些单元测试,部分功能是调用 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/
和 DontCodeTired:http://dontcodetired.com/blog/post/In-Process-Http-Server-for-Integration-Test-Faking-with-Owin-Katana-and-WebAPI
我遇到的问题是,我正在创建用于发出请求的 WebApi 服务器将自动检测项目中的其他 API 和针对该请求的 运行,而不是使用我的装置 test/mock 控制器。
如何使用 HttpConfiguration
对象,在 WebApp.Start<**Startup**>()
class 中只使用一个控制器?我的意思是 class:
internal class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
config.EnsureInitialized();
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
app.UseWebApi(config);
}
}
我不清楚如何解决这个问题,因为所有在线示例都在讨论映射 HTTP 路由,而不是 removing/manually 添加路由。
如果您有 questions/criticisms 请添加评论,我会尽我所能更新问题,我觉得由于工作原因我可能 post 会受到一些限制。
我有一个解决方案,我认为一个整洁的..
基于 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;
}
}
然后替换启动中的默认解析器class:
config.Services.Replace(typeof(IAssembliesResolver), new MyAssembliesResolver());
这允许我排除额外的生产 ApiController
(我正在尝试测试),并且只包括我的 ApiController
用于内存 Owin 管道中的单元测试。