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

时间:2018-09-13 16:44:10

标签: c# unit-testing asp.net-web-api

我有一个要进行单元测试的Web API控制器方法。它需要一个HttpRequestMessage,但是我不知道如何设置要传递的内容。是否可以创建/模拟HttpRequestMessage以便给它一个{{ 1}}我想成为string的结果吗?

这是我的控制器方法:

await request.Content.ReadAsStringAsync()

我可以使用其无参数构造函数轻松创建[HttpPost] public async Task<HttpResponseMessage> Post(HttpRequestMessage request) { var data = await request.Content.ReadAsStringAsync(); //do something with data } ,但是我无法确定如何将内容设置为有意义的值。我希望我的测试遵循以下原则:

HttpRequestMessage

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

(更多情况下,我想让方法采用[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 } 的原因是因为我正在使用旧版代码库,其中包含大量的控制器方法,而这些控制器方法采用了HttpRequestMessage

1 个答案:

答案 0 :(得分:1)

  

是否可以将内容的值设置为某些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
}

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

  

还是我需要更改方法,以便采用其他参数?

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