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
。)
是否可以将内容的值设置为一些 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
作为参数。
还是我需要更改方法以便它采用不同的参数?
存在模型绑定器,可用于具有强类型的动作参数,这些参数将解析传入的数据并在传递给动作之前填充模型。
归档时间: |
|
查看次数: |
6682 次 |
最近记录: |