c# - 在 MVC 中测试控制器时如何转换恢复的 JSON 对象
问题描述
我正在尝试为我的 MVC 控制器编写一些自动化的端到端集成测试,因为我们有严格的测试要求,我只测试服务是不够的。
我有一个控制器的方法:
[HttpGet("myPath")]
public async Task<ActionResult<IEnumerable<Foo>>> GetFoos()
{
Return Ok( _service.GetFoos());
}
我想对其进行如下测试:
Public Async Task TestController(){
…
Var result=await Client.GetAsync("/myPath"); var jsonFromResponse = await
response.Content.ReadAsStringAsync();
var myList=(IEnumerable<Foo>)JsonConvert.DeserializeObject(jsonFromResponse);
// PERFORM ASSERTION on myList
}
然而,这是例外
---> System.InvalidCastException:无法将“Newtonsoft.Json.Linq.JArray”类型的对象转换为“System.Collections.Generic.List`1[Foo]”类型。
我返回的 JSON 结果似乎还可以,它是:
[
{
"type": 1,
"study": {
"id": 96,
"createdDate": "2017-10-10T00:00:00",
"updatedDate": null,
"X": null
},
"id": 262,
"createdDate": "2019-10-14T07:36:40.104368",
"updatedDate": "2019-10-14T07:36:40.118568"
},
{
"type": 1,
"study": {
"id": 96,
"createdDate": "2017-10-10T00:00:00",
"updatedDate": null,
"X": null
},
"id": 263,
"createdDate": "2019-10-14T07:36:40.147418",
"updatedDate": "2019-10-14T07:36:40.160704"
},
…
]
解决方案
将反序列化对象的实现更改为DeserializeObject<T>
var myList=JsonConvert.DeserializeObject<IEnumerable<Foo>>(jsonFromResponse);
上面的代码会自动返回 required 中的对象T
。
在此处阅读有关 DeserializeObject 的详细信息
推荐阅读
- powerbi - 使用身份验证将 Web API 作为数据源连接到 power bi
- vba - Microsoft Word VBA:仅在某些文本字符串中将一个字符替换为另一个字符
- javascript - 如何更改 React JS 中单击按钮的颜色?
- api - 使用 Chrome 身份验证令牌访问 Slack API xoxc-
- javascript - 从对象数组中的数组中打印出项目
- laravel - 如何使用 Laravel 在 $request 过滤器中连接 first_name 和 last_name
- google-apps-script - 在 Google 表格中将日期增加 7 天
- python - 使用分隔符在字符串中搜索值
- c++ - 当别名定义为“const int alias = variable”而不是#define时使用ifndef时重新定义错误
- python - 欧拉方案:ValueError:数组不得包含 infs 或 NaNs