如何使用 Flurl 测试内存中的 ASP.NET Web API 运行?

How to test an ASP.NET Web API running in-memory using Flurl?

我尝试解决的问题:

如何测试调用 REST 的客户端代码和真正的 REST 服务器代码(以一种有效的方式)?

目标:

  1. 这将是一种集成测试,但又快又简单

  2. 它将允许检测 e。 G。客户端使用错误动词调用 REST 方法的错误(例如 PUT,但 API 接受 POST)

  3. 我发现通过部署 REST 服务进行集成测试然后使用我的 API 库进行调用过于复杂,所以我想用内存中的 unit/integration 测试

  4. 我觉得 Flurl 库很有用,所以我想在这样的测试中使用它。

  5. 灵感:

我的想法: 我想在内存中(使用 HttpServer)对真实的 ApiController 运行 进行 Flurl Api 测试,而不是使用 Flurl HttpTest。我在这里找到了这个技巧: 但是它需要每次都构建 HttpRequest 消息并且没有很好的 Api 用于测试。是否可以 运行 Flurl 代码来对抗真正的内存中 Api 控制器测试?

我没有对此进行测试,但我相信您应该能够通过创建自定义 HttpClientFactory 并覆盖 CreateMessageHandler:

来将 Flurl 与内存托管一起使用
public class TestingClientFactory : DefaultHttpClientFactory
{
    public overrride HttpMessageHandler CreateMessageHandler()
    {
        var config = new HttpConfiguration();
        //configure web api
        WebApiConfig.Register(config);

        return new HttpServer(config);
    }
}

在您的测试组件中,全局注册,理想情况下 运行 在测试夹具设置上只注册一次:

FlurlHttp.Configure(settings => settings.HttpClientFactory = new TestingClientFactory());

现在每次 Flurl 需要在您的测试中创建一个新的 HttpClient 时,它都会使用内存服务器。