Как отладить задачу <> Результат?
Я настраиваю некоторые модульные тесты и используя 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();
Однако нет никаких причин для издевательства над задачами, так как вы можете легко создавать завершенные/неудачные/отмененные задачи напрямую.