使用Web API SelfHost进行Specflow测试
本文关键字:Specflow 测试 进行 SelfHost Web API 使用 | 更新日期: 2023-09-27 18:18:12
我有一个服务项目(WebAPI)和一个可以访问服务api的客户端项目。我想使用Specflow(或类似的东西)做一个端到端测试。我想从测试中控制服务的配置方式,这样我就可以在需要的地方使用模拟/存根/假人。
当WCF还是最酷的东西的时候,我做过这样的测试,通过创建我的服务的实例并使用标准的。net ServiceHost来托管它们。所有的编程方式。这招很管用。我想对我的Web API服务做类似的事情,所以我认为自托管是可行的方法。但由于某种原因,这真的很难开始工作(比如,我还没有成功)。
有人做类似的事情有任何积极的结果吗?我不想把南斯牵扯进来,除非这是唯一的办法。
我需要什么:1. 以编程方式启动服务,以控制服务的配置方式(要注入哪些依赖项,等等)。2. 调用客户端api上的方法(或者实际上只是在测试中做webrequest)来访问我刚刚启动的服务。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);
}
}
你可以创建一个self host并托管你的控制器,还可以根据控制器设置模拟依赖项。
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;
}
}
}
在self主机环境中托管Web Api,你可以模拟依赖