所以我是TDD的新手,並且我使用MVP模式成功創建了一個很好的小示例應用程序。我當前的解決方案的主要問題是它阻塞UI線程,所以我試圖設置Presenter使用SynchronizationContext.Current,但是當我運行我的測試時,SynchronizationContext.Current爲null。TDD測試重構以支持多線程
主持人之前線程
public class FtpPresenter : IFtpPresenter
{
...
void _view_GetFilesClicked(object sender, EventArgs e)
{
_view.StatusMessage = Messages.Loading;
try
{
var settings = new FtpAuthenticationSettings()
{
Site = _view.FtpSite,
Username = _view.FtpUsername,
Password = _view.FtpPassword
};
var files = _ftpService.GetFiles(settings);
_view.FilesDataSource = files;
_view.StatusMessage = Messages.Done;
}
catch (Exception ex)
{
_view.StatusMessage = ex.Message;
}
}
...
}
測試線程
[TestMethod]
public void Can_Get_Files()
{
var view = new FakeFtpView();
var presenter = new FtpPresenter(view, new FakeFtpService(), new FakeFileValidator());
view.GetFiles();
Assert.AreEqual(Messages.Done, view.StatusMessage);
}
現在我加入了的SynchronizationContext線程後給演示之前,我試圖設置的AutoResetEvent上我的假觀爲StatusMessage,但是當我運行測試SynchronizationContext.Current爲空。我意識到我在新的Presenter中使用的線程模型並不完美,但這是測試多線程的正確技術嗎?爲什麼我的SynchronizationContext.Current爲空?我該怎麼做呢?
演示線程
[TestMethod]
public void Can_Get_Files()
{
var view = new FakeFtpView();
var presenter = new FtpPresenter(view, new FakeFtpService(), new FakeFileValidator());
view.GetFiles();
view.GetFilesWait.WaitOne();
Assert.AreEqual(Messages.Done, view.StatusMessage);
}
假查看後
public class FakeFtpView : IFtpView
{
...
public AutoResetEvent GetFilesWait = new AutoResetEvent(false);
public event EventHandler GetFilesClicked = delegate { };
public void GetFiles()
{
GetFilesClicked(this, EventArgs.Empty);
}
...
private List<string> _statusHistory = new List<string>();
public List<string> StatusMessageHistory
{
get { return _statusHistory; }
}
public string StatusMessage
{
get
{
return _statusHistory.LastOrDefault();
}
set
{
_statusHistory.Add(value);
if (value != Messages.Loading)
GetFilesWait.Set();
}
}
...
}
好問題!我正在嘗試解決類似的問題! – 2010-10-10 16:45:34