首页 > 解决方案 > 在 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"
  },

…
]

标签: c#jsonasp.net-mvcasp.net-core

解决方案


将反序列化对象的实现更改为DeserializeObject<T>

var myList=JsonConvert.DeserializeObject<IEnumerable<Foo>>(jsonFromResponse);

上面的代码会自动返回 required 中的对象T

在此处阅读有关 DeserializeObject 的详细信息


推荐阅读