为 Web API 单元测试指定 HttpRequestMessage 的内容

Tim*_*Tim 7 c# unit-testing asp.net-web-api

我有一个要进行单元测试的 Web API 控制器方法。它接受 aHttpRequestMessage但我不知道如何设置我想要传入的内容。是否可以创建/模拟 aHttpRequestMessage以便我可以给它一个string我想要的结果await request.Content.ReadAsStringAsync()

这是我的控制器方法:

[HttpPost]
public async Task<HttpResponseMessage> Post(HttpRequestMessage request)
{
    var data = await request.Content.ReadAsStringAsync();
    //do something with data
}
Run Code Online (Sandbox Code Playgroud)

我可以HttpRequestMessage使用其无参数构造函数轻松创建,但我无法弄清楚如何将内容设置为有意义的值。我希望我的测试按照以下方式工作:

[TestMethod]
public async Task PostMethodWorks()
{
    var controller = new MyController();

    var data = "this will be JSON";
    var httpRequestMessage = new HttpRequestMessage();
    //set the content somehow so that httpRequestMessage.Content.ReadAsStringAsync returns data

    var response = await controller.Post(httpRequestMessage);

    //assert something about the response here
}
Run Code Online (Sandbox Code Playgroud)

是否可以将内容的值设置为某个 JSON,或者我是否需要更改方法以便它采用不同的参数?

(对于更多上下文,我想让该方法接受 aHttpRequestMessage的原因是因为我正在处理一个遗留代码库,其中包含大量控制器方法,这些方法接受 a HttpRequestMessage。)

Nko*_*osi 9

是否可以将内容的值设置为一些 JSON

是的

您可以使用许多HttpContent派生类中的任何一种。由于在这种情况下您要发送 JSON 内容,因此您需要使用StringContent class

例如

[TestMethod]
public async Task PostMethodWorks() {
    //Arrange
    var controller = new MyController();

    var data = "this will be JSON";
    var httpRequestMessage = new HttpRequestMessage();

    //set the content somehow so that httpRequestMessage.Content.ReadAsStringAsync returns data 
    httpRequestMessage.Content = new StringContent(data, Encoding.UTF8, "application/json");


    //Act
    var response = await controller.Post(httpRequestMessage);

    //Assert
    //assert something about the response here
}
Run Code Online (Sandbox Code Playgroud)

然而,这感觉像是一个XY 问题,因为理想情况下 Web API 操作不HttpRequestMessage作为参数。

还是我需要更改方法以便它采用不同的参数?

存在模型绑定器,可用于具有强类型的动作参数,这些参数将解析传入的数据并在传递给动作之前填充模型。