Подтвердить что ты не робот

Получение содержимого из HttpResponseMessage для тестирования с использованием ключевого слова С# dynamic

В одном из действий я делаю что-то вроде этого

public HttpResponseMessage Post([FromBody] Foo foo)
{
    .....
    .....

    var response = 
          Request.CreateResponse(HttpStatusCode.Accepted, new { Token = "SOME_STRING_TOKEN"});
    return response;
}

и другие методы возвращают экземпляр анонимного типа, и он работает хорошо.

Теперь я пишу тесты для этого. У меня

HttpResponseMessage response = _myController.Post(dummyFoo);

HttpResponseMessage имеет свойство Content и имеет ReadAsAsync<T>().

Я знаю, что если бы существовал конкретный конкретный тип, я мог бы сделать

Bar bar = response.Content.ReadAsAsync<Bar>();

но как мне получить доступ к анонимному типу, который возвращается? Возможно ли это?

Я надеялся сделать следующее:

dynamic responseContent = response.Content.ReadAsAsync<object>();
string returnedToken = responseContent.Token;

но я получил ошибку, что экземпляр объекта типа не имеет свойства Token. Это происходит, даже если отладчик показывает responseContent с одним свойством Token. Я понимаю, почему это происходит, но я хочу знать, есть ли способ доступа к Property.

enter image description here

Спасибо

4b9b3361

Ответ 1

.ReadAsAsync<T> - это асинхронный метод, означающий, что он не возвращает весь десериализованный объект, а Task<T> для обработки продолжения всей асинхронной задачи.

У вас есть два варианта:

1. Асинхронный шаблон.

Используйте ключевое слово async в методе enclousing (например: public async void A()) и выполните асинхронный вызов следующим образом:

dynamic responseContent = await response.Content.ReadAsAsync<object>();
string returnedToken = responseContent.Token;

2. API обычной задачи

Или просто используйте API-интерфейс Task:

response.Content.ReadAsAsync<object>().ContinueWith(task => {
   // The Task.Result property holds the whole deserialized object
   string returnedToken = ((dynamic)task.Result).Token;
});

Это вам!

Update

Прежде чем опубликовать весь скриншот, никто не может знать, что вы вызываете task.Wait, чтобы ждать результата async. Но я буду поддерживать свой ответ, потому что это может помочь другим посетителям:)

Как я предложил в комментарии к собственному ответу, вы должны попробовать десериализацию до ExpandoObject. ASP.NET WebAPI использует JSON.NET как базовый сериализатор JSON. То есть, он может обрабатывать десериализацию анонимного JavaScript для объектов expando.