我正在尋找一種方法來測試Action方法上的BeginInvoke,因爲該方法在後臺線程上運行,所以無法知道它何時實際完成或調用回調方法。我正在尋找一種方法來保持我的測試等待,直到回調被調用之後才進行斷言。如何在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";
}
}
聽起來不錯,已經考慮過它並可以將它用於新代碼,但是如何單元測試直接調用BeginInvoke的現有代碼。 – skjagini 2011-05-04 17:32:12
重構?依賴存在於那裏;單元測試的唯一方法是將其抽象出來,或者不對其進行測試。 =/ – Tejs 2011-05-04 18:00:21
'callback'參數必須是AsyncCallback類型。但是,謝謝你,這是偉大的:) – soniiic 2011-10-21 09:45:48