我有一个要进行单元测试的Web API Controller 方法。它需要一个HttpRequestMessage,但我不知道如何设置要传递的内容。是否可以创建/模拟HttpRequestMessage,以便为它提供一个string,我想将其作为await request.Content.ReadAsStringAsync()的结果?

这是我的 Controller 方法:

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

我可以使用其无参数构造函数轻松创建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
}

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

(对于更多上下文,我想让该方法接受HttpRequestMessage的原因是因为我正在使用旧版代码库,其中包含许多接受HttpRequestMessage的 Controller 方法。)

最佳答案





您可以使用许多 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
}

但是,这感觉像XY problem,因为理想情况下,Web API操作不将HttpRequestMessage作为参数。



存在模型绑定(bind)程序,可以使用它们具有强类型的操作参数,这些参数将解析传入的数据并在将模型传递给操作之前填充模型。

10-04 18:46