我有一个服务项目(WebAPI)和一个可以访问服务API的客户端项目。我想使用Specflow(或类似的东西)进行端到端测试。我想控制如何从测试中配置服务,所以我可以在需要时使用模拟/存根/虚拟变形。
当WCF是最酷的时候,我做了这样的测试,通过创建我的服务实例并使用标准.Net ServiceHost托管它们。全部以编程方式。它就像一个魅力。我想用我的Web API服务做类似的事情,所以我认为自我托管是要走的路。但由于某种原因,这真的很难开始工作(因为我还没有成功)。
有没有人做过类似的积极结果?我宁愿不让Nance参与其中,除非这是唯一的方法。
我需要什么: 1.以编程方式启动服务,以控制服务的配置方式(要注入的依赖项等) 2.在客户端api上调用方法(或者实际上只是在测试中执行WebRequests)命中我刚刚启动的服务。 3.性能不是真正的问题,但代码的清晰度是。
任何?
最终解决方案:
我的问题实际上与自托管无关。我有一个自定义路径的Get方法的参数:
[Route("api/PermissionChoice/{customerId}")]
public IEnumerable<PermissionChoice> Get(Guid customerId)
但是在启动selfhost时不会应用自定义路由。需要考虑自定义路线的配置。
最终结果如下:
[Fact]
public void WhatDoesItTest()
{
using (WebApp.Start<Startup>(_baseAddress))
{
var client = new HttpClient();
var response = client.GetAsync(_baseAddress + "api/PermissionChoice/4351A155-3F4B-46CE-9C7A-4BA377D5FDDF").Result;
var permissionChoices = response.Content.ReadAsAsync<IEnumerable<PermissionChoice>>().Result;
permissionChoices.First().PermissionId.Should().NotBeEmpty();
}
}
public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
config.Routes.MapHttpRoute(
name: "Default",
routeTemplate: "api/{controller}/{customerId}",
defaults: new {customerId = RouteParameter.Optional});
var container = new WindsorContainer();
container.Install(FromAssembly.This());
config.DependencyResolver = new WindsorDependencyResolver(container);
app.UseWebApi(config);
}
}
答案 0 :(得分:1)
您可以创建自托管并托管您的控制器,并根据控制器设置模拟依赖项。
public static class HttpClientFactory
{
private static HttpClient httpClient;
public static HttpClient Create()
{
if (httpClient == null)
{
var baseAddress = new Uri("http://localhost:8081");
var configuration = new HttpSelfHostConfiguration(baseAddress);
var selfHostServer = new HttpSelfHostServer(configuration);
httpClient = new HttpClient(selfHostServer) {BaseAddress = baseAddress};
return httpClient;
}
return httpClient;
}
}
}
它在自托管环境中托管Web Api,您可以模拟依赖