如何在 web api 仍在 iis 上运行时在内存托管框架中使用组件测试 web api?

How to component test web api using in memory hosting framework while web api still runs on iis?

我正在尝试创建组件测试项目来测试 Web API 服务,我想在 OWIN 等内存托管解决方案中使用,我想知道这是否可行,也是吗Web API 项目可能会 运行 与 IIS 而只有测试项目会 运行 在内存中?

内存托管框架有推荐的吗?

您可以使用 Owin 自行托管 api,这样您就可以针对 api 的 运行ning 版本执行测试。但是,您应该能够使用单元测试来测试您的控制器逻辑,而不需要实际托管您的 api。

不过,可能有正当理由将它们托管在单元测试中,所以我们开始吧:

解释了控制台应用程序中的自托管 here。如果它可以在控制台应用程序中 运行 它也可以在单元测试项目中 运行 。一个例子可以是(伪代码):

using Microsoft.Owin.Hosting
using Owin
using System.Web.Http
using Microsoft.Owin.Cors
using System.Web.Http.Dispatcher
using System.Threading.Tasks

string service = "http://localhost:54321";

[TestMethod]
public async Task MyTest()
{
    using (var webApp = WebApp.Start(service, BuildConfiguration))
    {
        var requestUrl = string.Format($"{service}/api/Foo/Bar");

        var client = new HttpClient();
        var response = await client.GetAsync(requestUrl);
        Assert.IsTrue(response.IsSuccessStatusCode);    
    }
}

public void BuildConfiguration(IAppBuilder appBuilder)
{
    var HttpConfiguration = new System.Web.Http.HttpConfiguration();

    HttpConfiguration.Services.Replace(typeof(IAssembliesResolver), new AssembliesResolver());

    HttpConfiguration.MapHttpAttributeRoutes();
    HttpConfiguration.Routes.MapHttpRoute("DefaultApi",
                $"api/{{controller}}/{{action}}/{{id}}", new { id = RouteParameter.Optional });


    appBuilder.UseCors(CorsOptions.AllowAll);
    appBuilder.UseWebApi(HttpConfiguration);

    HttpConfiguration.EnsureInitialized();
}

[RoutePrefix("api/Foo")]
public class FooController : ApiController
{
    [HttpGet]
    [Route("Bar")]
    public string GetBar()
    {
        return "Hello World";
    }
}

public class AssembliesResolver : DefaultAssembliesResolver
{
    private List<Assembly> assemblies;

    public override ICollection<Assembly> GetAssemblies()
    {
        assemblies = new List<Assembly> { GetType().Assembly };

        return assemblies;
    }
}

现在,您要测试的控制器可能位于另一个程序集中,而不是测试程序集中。您可能必须为单元测试项目使用程序集解析器才能发现您的 api。您可以为此编写自己的 AssembliesResolver,如我的回答所示。

不过要注意。根据您的设置,您必须确保您的测试环境与真实场景相匹配。在设置内存托管环境所需的不同参数方面,IIS 和自托管 Web api 之间可能存在细微差别