c# - son - signos mayor que y menos que ejemplos
¿Cómo simular un resultado de tarea<>? (1)
Lo más simple es devolver una tarea completada con el resultado esperado:
var responseTask = Task.FromResult(response);
Imagino que la razón por la que se cuelga es que la tarea simulada nunca se inicia y, por lo tanto, la función dada no se ejecuta. Podrías iniciarlo en tu prueba:
var responseTask = MockRepository.GenerateMock<Task<HttpResponseMessage>>(taskFunc);
responseTask.Start();
Sin embargo, no hay razón para simular tareas, ya que puede crear fácilmente tareas completadas / fallidas / canceladas directamente.
Estoy configurando algunas pruebas unitarias y utilizando Rhino Mocks para rellenar el objeto que se está probando. Una de las cosas que se está burlando es la Task<HttpResponseMessage>
, ya que la lógica que se está probando incluye una llamada a un HttpClient
para obtener una respuesta asíncrona.
Así que he empezado a configurar las simulacros de esta manera:
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);
(El paso de "prueba" de la prueba será crear una instancia del objeto que se está probando, alimentarlo con el httpClient
y ejecutar un método en él. La "afirmación" verificará a través de los simulacros de que se realizaron las llamadas del método esperado en ellos).
Al pasar por esto en un depurador, hay un bloqueo indefinido en esta línea:
responseTask.Stub(t => t.Result).Return(response);
No tengo mucha experiencia con Rhino Mocks o con C # async, por lo que puedo pasar por alto algo obvio. El objetivo, por supuesto, es que cualquier llamada a la propiedad .Result
devuelva el simulacro de response
. Pero parece que mi intento en sí mismo quizás esté invocando. ¿ .Result
que esperaría esperar indefinidamente ya que es solo una burla, tal vez?
¿Cuál es la manera correcta de arreglar esto? Esencialmente necesito proporcionar a mi objeto un HttpClient
y afirmar que se llamó a un método con un argumento específico.