Я настраиваю некоторые модульные тесты и используя 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
и утверждать, что на него был вызван метод с определенным аргументом.