猿问

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

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


这是我的控制器方法:


[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,或者我需要更改方法以便它采用不同的参数?


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


守候你守候我
浏览 228回答 1
1回答

慕桂英4014372

是否可以将内容的值设置为一些 JSON是的您可以使用许多HttpContent派生类中的任何一种。由于在这种情况下您要发送 JSON 内容,因此您需要使用StringContent class例如[TestMethod]public async Task PostMethodWorks() {&nbsp; &nbsp; //Arrange&nbsp; &nbsp; var controller = new MyController();&nbsp; &nbsp; var data = "this will be JSON";&nbsp; &nbsp; var httpRequestMessage = new HttpRequestMessage();&nbsp; &nbsp; //set the content somehow so that httpRequestMessage.Content.ReadAsStringAsync returns data&nbsp;&nbsp; &nbsp; httpRequestMessage.Content = new StringContent(data, Encoding.UTF8, "application/json");&nbsp; &nbsp; //Act&nbsp; &nbsp; var response = await controller.Post(httpRequestMessage);&nbsp; &nbsp; //Assert&nbsp; &nbsp; //assert something about the response here}然而,这感觉就像一个XY 问题,因为理想情况下 Web API 操作不会HttpRequestMessage作为参数。还是我需要更改方法以便它采用不同的参数?存在模型绑定器,可用于具有强类型操作参数,这些参数将解析传入数据并填充模型,然后再传递给操作。
随时随地看视频慕课网APP
我要回答