如何测试接受 Protobuf 作为请求主体的 API 控制器
How to test my API Controller that accepts Protobuf as request body
我有一个接受 protobufs 作为主体的控制器。现在,我想针对虚拟 .net 控制台应用程序测试我的控制器的功能(不是单元测试)。我不知道该怎么办。
代码如下:
public async Task<IActionResult> GetData([FromBody] Request request)
{
Response response = new Response();
if (request == null) {
return BadRequest("Request is null");
}
//Do Something.
return Ok(response);
}
我还有一个自定义输入格式器:
public class CustomInputFormatter : InputFormatter
{
public string ContentType { get; } = "application/protobuf";
public override bool CanRead(InputFormatterContext context)
{
var requestContentType = context.HttpContext.Request.ContentType;
if (string.IsNullOrEmpty(requestContentType))
{
context.HttpContext.Request.ContentType = ContentType;
return true;
}
else if (requestContentType.Contains(ContentType, System.StringComparison.OrdinalIgnoreCase))
{
return true;
}
return false;
}
public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context)
{
var request = context.HttpContext.Request;
if (request.ContentLength == 0)
{
return InputFormatterResult.Failure();
}
using (var ms = new MemoryStream())
{
await request.Body.CopyToAsync(ms).ConfigureAwait(false);
try
{
var req= Request.Parser.ParseFrom(ms.ToArray());
return InputFormatterResult.Success(ms.ToArray());
}
catch (InvalidProtocolBufferException)
{
return InputFormatterResult.Failure();
}
}
}
}
如何测试此控制器的功能?服务器 运行 在 https://localhost:8443/api/uriEndpoint
有什么指点吗?提前致谢。
以下客户端代码帮助我调用了相应的 API:
var request = new ProtoBufRequestObject();
// Populate your request object as needed
using var stream = new MemoryStream();
request.WriteTo(stream);
stream.Seek(0, SeekOrigin.Begin);
try
{
var r = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri(RequestEndpoint),
Content = new StreamContent(stream),
};
var response = await client.SendAsync(r).ConfigureAwait(false);
Assert.IsTrue(response.IsSuccessStatusCode);
var config = ProtoBufResponseObject.Parser.ParseFrom(response.Content.ReadAsStreamAsync().GetAwaiter().GetResult());
}
catch (Exception e)
{
//Do something
}
除此之外,您还需要检查一些事项:
- 确保在您的
CustomInputFormatter
中覆盖 CanRead
returns true
满足您的要求。
- 在
services.AddMvc
块中的 Startup.cs
文件中注册您的 CustomInputFormatter
。
我有一个接受 protobufs 作为主体的控制器。现在,我想针对虚拟 .net 控制台应用程序测试我的控制器的功能(不是单元测试)。我不知道该怎么办。
代码如下:
public async Task<IActionResult> GetData([FromBody] Request request)
{
Response response = new Response();
if (request == null) {
return BadRequest("Request is null");
}
//Do Something.
return Ok(response);
}
我还有一个自定义输入格式器:
public class CustomInputFormatter : InputFormatter
{
public string ContentType { get; } = "application/protobuf";
public override bool CanRead(InputFormatterContext context)
{
var requestContentType = context.HttpContext.Request.ContentType;
if (string.IsNullOrEmpty(requestContentType))
{
context.HttpContext.Request.ContentType = ContentType;
return true;
}
else if (requestContentType.Contains(ContentType, System.StringComparison.OrdinalIgnoreCase))
{
return true;
}
return false;
}
public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context)
{
var request = context.HttpContext.Request;
if (request.ContentLength == 0)
{
return InputFormatterResult.Failure();
}
using (var ms = new MemoryStream())
{
await request.Body.CopyToAsync(ms).ConfigureAwait(false);
try
{
var req= Request.Parser.ParseFrom(ms.ToArray());
return InputFormatterResult.Success(ms.ToArray());
}
catch (InvalidProtocolBufferException)
{
return InputFormatterResult.Failure();
}
}
}
}
如何测试此控制器的功能?服务器 运行 在 https://localhost:8443/api/uriEndpoint
有什么指点吗?提前致谢。
以下客户端代码帮助我调用了相应的 API:
var request = new ProtoBufRequestObject();
// Populate your request object as needed
using var stream = new MemoryStream();
request.WriteTo(stream);
stream.Seek(0, SeekOrigin.Begin);
try
{
var r = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri(RequestEndpoint),
Content = new StreamContent(stream),
};
var response = await client.SendAsync(r).ConfigureAwait(false);
Assert.IsTrue(response.IsSuccessStatusCode);
var config = ProtoBufResponseObject.Parser.ParseFrom(response.Content.ReadAsStreamAsync().GetAwaiter().GetResult());
}
catch (Exception e)
{
//Do something
}
除此之外,您还需要检查一些事项:
- 确保在您的
CustomInputFormatter
中覆盖CanRead
returnstrue
满足您的要求。 - 在
services.AddMvc
块中的Startup.cs
文件中注册您的CustomInputFormatter
。