Action メソッドで BeginInvoke をテストする方法を探しています。メソッドはバックグラウンド スレッドで実行されるため、実際に完了したりコールバック メソッドを呼び出したりするタイミングを知る方法はありません。アサーションを行う前にコールバックが呼び出されるまでテストを待機させる方法を探しています。
次の Presenter クラスでは、データがフェッチされたときにビューを更新するバックグラウンド スレッドで PopulateView を呼び出しており、ビューのプロパティが正しく初期化されていることをアサートしようとしていることがわかります。
NUnit と 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";
}
}