快速了解我的解决方案目前正在进行的工作。我正在使用XUnit框架和我创建的一些json验证助手在c#中编写非常基本的API Web测试,以验证从API接收的响应消息和有效负载。我一直在撞墙试图找出为什么我的PostAsync()调用一旦到达API就传递null,因为在调试我的ApiTests解决方案时我可以看到请求体是一个有效的json请求。以下是我正在调试的测试的一些片段。
OrderControllerTests.cs
[Theory]
[MemberData(nameof(OrderControllerData.postCancelOrder), MemberType = typeof(OrderControllerData))]
public async Task PostValidCancelOrder(string jsonBody, string expectedResponseBody)
{
var postObject = "api/Order/cancel";
var request = new StringContent(jsonBody, Encoding.UTF8, "application/json");
var response = await _httpClient.PostAsync(postObject, request);
var content = await response.Content.ReadAsStringAsync();
ValidationHelper.ValidateNoErrors(response);
ValidationHelper.ValidateJson(content, expectedResponseBody);
}
此测试中发生了一些事情。所有这些似乎都正常工作(按照下面的#3除外)。
现在这是我发布到api的内容。
"{\"orderId\": \"c701b60a-4fb1-4f79-9e17-0172a9a17bbc\",\"test1Fee\":\"5}\",\"test2Fee\":\"10\"}"
这是Api / OrderController中的HttpPost。
OrderController.cs
[HttpPost("cancel")]
public async Task<IActionResult> Cancel([FromBody]CancelOrderViewModel model)
{
var command = new CancelOrderCommand(model.OrderId, model.Test1Fee, model.Test2Fee);
var order = await _mediator.Send(command);
return Ok(order);
}
本质上,这个HttpPost传递一些参数,然后运行多个方法并检查这些对象,以确定订单是否有资格被取消。在帖子中发生的事情现在无关紧要。在调试我的测试并且它到达api的HttpPost方法的入口点时,'command'和'model'都是null。当然,Api会拒绝请求,并以500错误响应。
{StatusCode: 500, ReasonPhrase: 'Internal Server Error', Version: 1.1, Content: System.Net.Http.NoWriteNoSeekStreamContent, Headers:{ Date: Mon, 22 Jan 2018 19:38:55 GMT Transfer-Encoding: chunked Server: Kestrel Request-Context: appId=cid-v1:93254013-d606-465f-8cee-12e422316f31 X-SourceFiles: =?UTF-8?B?RDpcUUFccWFWZW5kb3JcQWJzdHJhY3Rvck9tc0FwaVxzb3VyY2VcQXBpXGFwaVxPcmRlclxjYW5jZWw=?= X-Powered-By: ASP.NET Content-Type: application/json; charset=utf-8}}
此消息指示Object引用未设置为对象的实例,因为显然所有内容都为null。
所以问题必须与我在XUnit测试中构建请求的方式有关。但我很困惑,因为我相信我正确地序列化了json。即使Api在我的浏览器中使用swagger本地运行,指示的示例也是
{
"orderId": "string",
"test1Fee": 0,
"test2Fee": 0
}
我的帖子对象中创建的转义是否可以成为问题?如果是这样,我该如何解决这个问题呢?我尝试使用PostAsJsonAsync()而不仅仅是PostAsync(),但它继续产生相同的结果。
我在这里做错了什么?我确定这很简单,我只是错过了它。如果我需要提供更多信息,请告诉我。任何帮助将不胜感激。感谢。