Estoy buscando una manera de probar BeginInvoke en un método de acción, ya que el método se ejecuta en un subproceso en segundo plano no hay forma de saber cuándo se completa o llama al método de devolución de llamada. Estoy buscando una forma de mantener mi prueba en espera hasta que se llame a la devolución de llamada antes de hacer afirmaciones.Cómo probar BeginInvoke en una acción
En la siguiente clase Presenter, puede observar que estoy invocando PopulateView en el hilo de fondo que actualiza la vista cuando se obtienen datos y estoy tratando de afirmar la vista Las propiedades se inicializaron correctamente.
Estoy usando NUnit y Moq.
public class Presenter
{
private IView _view;
private IService _service;
public Presenter(IView view, IService service)
{
_view = view;
_service = service;
Action action = PopulateView;
action.BeginInvoke(PopulateViewCallback, action);
}
private void PopulateViewCallback(IAsyncResult ar)
{
try
{
Action target = (Action)ar.AsyncState;
target.EndInvoke(ar);
}
catch (Exception ex)
{
Logger.Instance.LogException("Failed to initialize view", ex);
}
}
private void PopulateView()
{
Thread.Sleep(2000); // Fetch data _service.DoSomeThing()
_view.Property1 = "xyz";
}
}
Suena bien, lo he pensado y puedo usarlo para el nuevo código, pero ¿cómo puedo probar el código existente que llama a BeginInvoke directamente? – skjagini
Refactor? La dependencia existe allí; la única forma de probar la unidad es abstraerla o no probarla. =/ – Tejs
el parámetro 'callback' tiene que ser del tipo AsyncCallback. Pero gracias, esto es genial :) – soniiic