Я пытаюсь написать несколько автоматизированных сквозных интеграционных тестов для моих контроллеров 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"
  },

…
]
0
shelbypereira 14 Окт 2019 в 10:49

1 ответ

Лучший ответ

Измените реализацию десериализации объекта на DeserializeObject<T>

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

Приведенный выше код автоматически вернет объект в требуемом T.

Подробную информацию о DeserializeObject см. здесь

1
user1672994 14 Окт 2019 в 07:52