का समर्थन करने के लिए टीडीडी टेस्ट रिफैक्टरिंग तो मैं टीडीडी के लिए नौसिखिया हूं, और मैंने सफलतापूर्वक एमवीपी पैटर्न का उपयोग करके एक अच्छा छोटा नमूना ऐप बनाया है। मेरे वर्तमान समाधान में बड़ी समस्या यह है कि यह यूआई थ्रेड को अवरुद्ध कर रहा है, इसलिए मैं सिंक्रनाइज़ेशन कॉन्टेक्स्ट.क्यूरेंट का उपयोग करने के लिए प्रेजेंटर को सेट अप करने का प्रयास कर रहा था, लेकिन जब मैं अपने परीक्षण चलाता हूं तो सिंक्रनाइज़ेशन कॉन्टेक्स्ट। कंटेंट शून्य है।मल्टी थ्रेडिंग
प्रस्तुतकर्ता
[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 थ्रेडिंग जोड़ा इससे पहले कि थ्रेडिंग
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;
}
}
...
}
टेस्ट इससे पहले कि मैं StatusMessage के लिए मेरे नकली दृश्य पर एक AutoResetEvent स्थापित करने के लिए कोशिश की, लेकिन जब मैं सिंक्रनाइज़ेशन कॉन्टेक्स्ट परीक्षण को चलाता हूं। वर्तमान शून्य है। मुझे एहसास है कि मेरे नए प्रेजेंटर में जो थ्रेडिंग मॉडल मैं उपयोग कर रहा हूं वह सही नहीं है, लेकिन क्या यह मल्टीथ्रेडिंग परीक्षण के लिए सही तकनीक है? मेरा सिंक्रनाइज़ेशन कॉन्टेक्स्ट। कंटेंट नल क्यों है? इसके बजाय मुझे क्या करना चाहिए?
प्रस्तुतकर्ता
[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();
}
}
...
}
अच्छा सवाल! मैं इसी तरह की समस्या को हल करने की कोशिश कर रहा हूं! –