Как отладить задачу <> Результат?

Я настраиваю некоторые модульные тесты и используя Rhino Mocks для заполнения тестируемого объекта. Одной из вещей, издевающихся над задачей, является Task<HttpResponseMessage>, поскольку тестируемая логика включает вызов HttpClient для получения асинхронного ответа.

Поэтому я начал настраивать такие вещи:

var httpClient = MockRepository.GenerateMock<HttpClient>();
var taskFunc = MockRepository.GenerateMock<Func<HttpResponseMessage>>();
var responseTask = MockRepository.GenerateMock<Task<HttpResponseMessage>>(taskFunc);
var response = MockRepository.GenerateMock<HttpResponseMessage>();

httpClient.Stub(c => c.PostAsJsonAsync<IEnumerable<LogMessage>>(Arg<string>.Is.Anything, Arg<IEnumerable<LogMessage>>.Is.Anything)).Return(responseTask);
responseTask.Stub(t => t.Result).Return(response);
response.Stub(r => r.IsSuccessStatusCode).Return(true);

(Шаг "действие" теста будет заключаться в том, чтобы создать экземпляр тестируемого объекта, httpClient его httpClient и запустить на нем метод. "Утверждение" будет проверяться через макеты, которые ожидали ожидаемые вызовы методов на них.)

Пройдя через это в отладчике, на этой строке существует неопределенный вид:

responseTask.Stub(t => t.Result).Return(response);

У меня нет большого опыта работы с Rhino Mocks или с асинхронным С#, поэтому я могу игнорировать что-то очевидное. Цель, конечно же, состоит в том, что любой вызов свойства .Result возвращает макет response. Но похоже, что моя попытка, возможно, вызывает .Result который я ожидаю ждать бесконечно, потому что это просто макет, возможно?

Каков правильный способ устроить это? По сути, мне нужно предоставить свой объект с HttpClient и утверждать, что на него был вызван метод с определенным аргументом.

Ответы

Ответ 1

Самое простое - вернуть завершенную задачу с ожидаемым результатом:

var responseTask = Task.FromResult(response);

Я полагаю, что причина этого в том, что издеваемое задание никогда не запускается, и поэтому данная функция не запускается. Вы можете запустить его в своем тесте:

var responseTask = MockRepository.GenerateMock<Task<HttpResponseMessage>>(taskFunc);
responseTask.Start();

Однако нет никаких причин для издевательства над задачами, так как вы можете легко создавать завершенные/неудачные/отмененные задачи напрямую.