使用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);
        }
    }

使用Web API SelfHost进行Specflow测试

你可以创建一个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,你可以模拟依赖