在内存中创建web api服务器时,路由不能正确映射

本文关键字:路由 不能 映射 服务器 内存 创建 web api | 更新日期: 2023-09-27 18:14:26

当我curl到/test路由时,它工作得很好,但是当尝试在同一路由上击中内存服务器时,低于404的测试。

当检查_client_config似乎是好的-虽然我不知道如何确认我的内存服务器正常运行

有没有人知道我如何能让我的内存web服务器映射它的路由正确,所以我的测试方法可以达到它?

namespace Robo.Tests.Controllers
{
    [TestClass]
    public class IntegrationTests
    {
        private HttpMessageInvoker _client;
        private HttpConfiguration _config = new HttpConfiguration();
        [TestInitialize]
        public void SetupTest()
        {
            _config.MapHttpAttributeRoutes();
            _config.EnsureInitialized();
            var server = new HttpServer(_config);
            _client = new HttpMessageInvoker(server);
        }
        [TestMethod]
        public async Task Test()
        {
            var result = await _client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "http://localhost/test"), CancellationToken.None);
        }
    }
}

和控制器,如果你感兴趣的话

namespace Robo.Controllers
{
    //[ValidationActionFilter]
    public class CVController : ApiController
    {
        [HttpGet]
        [Route("test")]
        public async Task<IHttpActionResult> test()
        {
            return Ok();
        }
    }
}

在内存中创建web api服务器时,路由不能正确映射

对于内存服务器测试,创建了以下实用程序类。它基本上封装了所示示例中的设置功能。

internal interface IHttpTestServer : IDisposable {
    HttpConfiguration Configuration { get; }
    HttpClient CreateClient();
}
internal class HttpTestServer : IHttpTestServer {
    HttpServer httpServer;
    public HttpTestServer(HttpConfiguration configuration = null) {
        httpServer = new HttpServer(configuration ?? new HttpConfiguration());
    }
    public HttpConfiguration Configuration {
        get { return httpServer.Configuration; }
    }
    public HttpClient CreateClient() {
        var client = new HttpClient(httpServer);
        return client;
    }
    public void Dispose() {
        if (httpServer != null) {
            httpServer.Dispose();
            httpServer = null;
        }
    }
    public static IHttpTestServer Create(HttpConfiguration configuration = null) {
        return new HttpTestServer(configuration);
    }
}
下面的测试是为了演示使用OP 在内存服务器中使用
[TestClass]
public class IntegrationTests {
    [TestMethod]
    public async Task Test() {

        using (var server = HttpTestServer.Create()) {
            //Arrange
            var config = server.Configuration;
            config.MapHttpAttributeRoutes();
            config.EnsureInitialized();
            var client = server.CreateClient();
            var url = "http://localhost/test";
            var request = new HttpRequestMessage(HttpMethod.Get, url);
            var expected = System.Net.HttpStatusCode.OK;
            //Act
            var result = await client.SendAsync(request, CancellationToken.None);
            //Assert
            Assert.IsNotNull(result);
            Assert.AreEqual(expected, result.StatusCode);
        }
    }
    public class CVController : ApiController {
        [HttpGet]
        [Route("test")]
        public async Task<IHttpActionResult> test() {
            return Ok();
        }
    }
}

测试通过。

关于这个例子的事情是测试和控制器存在于同一个程序集中,所以map属性扫描它被调用的程序集,并找到带有属性路由的API控制器。如果控制器位于另一个项目中,则应该在HttpConfiguration上调用该项目的web API配置以正确配置web API。

测试项目和web api项目应该是两个独立的项目。也就是说,web项目应该有一个带有静态WebApiConfig.Register类和方法的WebApiConfig.cs文件。该方法接受一个HttpConfiguration参数。测试应该使用该方法为内存调用配置api。

[TestClass]
public class IntegrationTests {
    [TestMethod]
    public async Task Test() {

        using (var server = HttpTestServer.Create()) {
            //Arrange
            var config = server.Configuration;
            //Config server
            MyWebApiNamespace.WebApiConfig.Register(config);
            var client = server.CreateClient();
            var url = "http://localhost/test";
            var request = new HttpRequestMessage(HttpMethod.Get, url);
            var expected = System.Net.HttpStatusCode.OK;
            //Act
            var result = await client.SendAsync(request, CancellationToken.None);
            //Assert
            Assert.IsNotNull(result);
            Assert.AreEqual(expected, result.StatusCode);
        }
    }
}