能否从.http文件创建HttpRequestMessage或HttpResponseMessage用于单元测试?
可以从.http文件创建HttpRequestMessage和HttpResponseMessage
当然可以实现,ASP.NET Core的测试生态里已经包含了相关的解析逻辑,你可以直接利用官方API或者自己实现简单的解析逻辑来适配MockHttp的单元测试场景。
一、解析生成HttpRequestMessage
首先安装Microsoft.AspNetCore.Mvc.Testing NuGet包,它包含了处理.http文件的工具类:
Install-Package Microsoft.AspNetCore.Mvc.Testing
通过以下代码从.http文件生成HttpRequestMessage:
using System.IO; using Microsoft.AspNetCore.Testing; public static async Task<HttpRequestMessage> CreateHttpRequestFromHttpFile(string filePath) { var httpContent = await File.ReadAllTextAsync(filePath); // 利用官方工具类解析.http内容生成请求 return HttpRequestMessageFactory.CreateFromHttpText(httpContent); }
注:若不同版本中
HttpRequestMessageFactory为内部类无法直接访问,可自行实现解析逻辑:拆分请求行、请求头和请求体,手动构建HttpRequestMessage。
二、解析生成HttpResponseMessage
读取.http文件内容后手动构建响应消息:
using System.IO; using System.Net; using System.Net.Http; using System.Text; public static async Task<HttpResponseMessage> CreateHttpResponseFromHttpFile(string filePath) { var httpContent = await File.ReadAllTextAsync(filePath); var sections = httpContent.Split(new[] { "\r\n\r\n" }, StringSplitOptions.RemoveEmptyEntries); // 解析状态行(如 HTTP/1.1 200 OK) var statusLineParts = sections[0].Split('\r')[0].Split(' ', 3); var statusCode = int.Parse(statusLineParts[1]); var response = new HttpResponseMessage((HttpStatusCode)statusCode) { ReasonPhrase = statusLineParts[2] }; // 解析响应头 var headerLines = sections[0].Split('\r\n').Skip(1); foreach (var line in headerLines.Where(l => !string.IsNullOrWhiteSpace(l))) { var colonIndex = line.IndexOf(':'); var headerKey = line.Substring(0, colonIndex).Trim(); var headerValue = line.Substring(colonIndex + 1).Trim(); response.Headers.TryAddWithoutValidation(headerKey, headerValue); } // 设置响应体 if (sections.Length > 1) { response.Content = new StringContent(sections[1], Encoding.UTF8); } return response; }
三、结合MockHttp使用示例
将生成的请求和响应整合到MockHttp测试用例中:
var mockHandler = new MockHttpMessageHandler(); // 从.http文件加载请求和响应 var testRequest = await CreateHttpRequestFromHttpFile("GetUsers.http"); var testResponse = await CreateHttpResponseFromHttpFile("UsersResponse.http"); // 配置MockHttp的响应规则 mockHandler.When(testRequest.Method, testRequest.RequestUri.AbsolutePath) .Respond(testResponse); // 创建测试HttpClient并发送请求 var httpClient = mockHandler.ToHttpClient(); var response = await httpClient.SendAsync(testRequest); // 执行断言逻辑 Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); var responseBody = await response.Content.ReadAsStringAsync(); Assert.Contains("user1", responseBody);
补充说明
Visual Studio的.http文件测试功能底层基于类似的解析逻辑,若需参考官方实现细节,可查看ASP.NET Core源码中的HttpTestRequestParser相关类。
内容的提问来源于stack exchange,提问作者Phil Bolduc
相关产品推荐
相关产品推荐

