我正在使用System.Web.Http.HttpServer来启动内存服务器,以用于我的Web API项目的集成测试。
我有一个Web API项目,以及解决方案中的单个Integration Test项目。这一切都很好。
现在我已经为解决方案添加了另一个Web API项目,当我为新的API控制器添加测试时 - 如果两个Web API项目的测试都在同一个测试运行中运行,那么测试将失败。
如果我为API'A'运行测试 - 它们都是绿色的。 如果我为API'B'运行测试 - 它们都是绿色的。 如果我在同一个testrun中运行API“A”的测试和API“B”的测试 - 第二次测试失败。
所以不知何故配置/设置相互渗透 - 我只是无法弄清楚为什么 - 最重要的是如何阻止它。
我在其他地方读过,Web API通过反射找到属性路由并加载程序集 - 这可能是发生了什么 - 两个API都在内存中 - 因此路由失败了吗?失败的第二个测试得到404回答。
我的测试构建如下
using (var config = new HttpConfiguration())
{
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
ServiceA.AutoMapperConfig.Configure();
ServiceA.WebApiConfig.Register(config, ImInvoiceService.ChooseAuthorizeFilter.Basic, addPerRequestHandler: false);
using (var server = new HttpServer(config))
{
var client = new HttpClient(server);
var request = CreateWebRequest(HttpMethod.Post, "api/invoices");
request.Content = new StringContent(CreateJsonInvoice(purchaseOrder, overrideCurrencyCode: "XXX"), Encoding.UTF8, JsonContentType);
var response = client.SendAsync(request).Result;
Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
}
}
和
using (var config = new HttpConfiguration())
{
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
ServiceB.AutoMapperConfig.Configure();
ServiceB.WebApiConfig.Register(config);
using (var server = new HttpServer(config))
{
var client = new HttpClient(server);
var request = CreateWebRequest(HttpMethod.Post, "api/invoices");
request.Content = new StringContent(CreateJsonInvoice(purchaseOrder, overrideCurrencyCode: "XXX"), Encoding.UTF8, JsonContentType);
var response = client.SendAsync(request).Result;
Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
}
}
如代码中所示,我在每个测试中创建了一个新的HttpServer和一个新的HttpConfiguration - 让我觉得我得到了新的对象。
我试图通过这种方式调试之后我很困难,我试图清除路由,配置设置等,但似乎没有任何帮助。
我可以为第二个API创建一个新的测试项目,但由于这是集成测试,我依赖于一些设置 - 并且需要将大量工作复制到另一个测试项目 - 我想避免这样做。
但是如果Web API / HttpServer无法处理同一个AppDomain中可能是我最后一个的两个项目。
欢迎任何好的建议 - 我希望有人有个好主意。
最好的问候 /安德斯