如何测试接受 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