使用Web API SelfHost进行Specflow测试

时间:2014-08-15 10:46:20

标签: c# testing asp.net-web-api self-hosting

我有一个服务项目(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);
        }
    }

1 个答案:

答案 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,您可以模拟依赖