Automatic testing of ApiController

前端 未结 4 1901
悲哀的现实
悲哀的现实 2021-01-23 06:35

I have an ApiController and would like to test it with unit tests including the routing.

An example:

[RoutePrefix(\"prefix\")]
public class          


        
4条回答
  •  礼貌的吻别
    2021-01-23 07:05

    I wrote a little helper class for in-memory integration testing that can be called as part of the test suit.

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

    And would then use it like this

    [TestMethod]
    public async Task HttpClient_Should_Get_OKStatus_From_InMemory_Hosting() {
    
        using (var server = new HttpTestServer()) {
    
            MyWebAPiProjectNamespace.WebApiConfig.Configure(server.Configuration);
    
            var client = server.CreateClient();
    
            string url = "http://localhost/prefix/10?id2=5";
            var expected = 15;
    
            var request = new HttpRequestMessage {
                RequestUri = new Uri(url),
                Method = HttpMethod.Get
            };
    
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    
            using (var response = await client.SendAsync(request)) {
                Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
                var result = await response.Content.ReadAsAsync();
                Assert.AreEqual(expected, result);
            }
        }
    }
    

    This will configure an in-memory test server that the test can make calls to using its httpclient. It is in essence an end-to-end integration test.

提交回复
热议问题