का कारण बनता है वर्तमान में हम यूनिट परीक्षण के दौरान कुछ मुद्दों का सामना कर रहे हैं। हमारी कक्षा राइनो मोक्स का उपयोग करके मॉक ऑब्जेक्ट्स पर कुछ फ़ंक्शन कॉल मल्टीथ्रेड कर रही है।मल्टीथ्रेड कोड बनाता है राइनो मोक्स डेडलॉक
public class Bar
{
private readonly List<IFoo> _fooList;
public Bar(List<IFoo> fooList)
{
_fooList = fooList;
}
public void Start()
{
var allTasks = new List<Task>();
foreach (var foo in _fooList)
allTasks.Add(Task.Factory.StartNew(() => foo.DoSomething()));
Task.WaitAll(allTasks.ToArray());
}
}
इंटरफ़ेस IFoo के रूप में परिभाषित किया गया है:: यहाँ एक उदाहरण न्यूनतम करने के लिए कम है
public interface IFoo
{
void DoSomething();
event EventHandler myEvent;
}
गतिरोध पुन: पेश करने के लिए, हमारे unittest निम्नलिखित है: 1. कुछ IFoo Mocks 2 पैदा करते हैं। DoEomething() कहा जाता है जब myEvent उठाओ।
[TestMethod]
public void Foo_RaiseBar()
{
var fooList = GenerateFooList(50);
var target = new Bar(fooList);
target.Start();
}
private List<IFoo> GenerateFooList(int max)
{
var mocks = new MockRepository();
var fooList = new List<IFoo>();
for (int i = 0; i < max; i++)
fooList.Add(GenerateFoo(mocks));
mocks.ReplayAll();
return fooList;
}
private IFoo GenerateFoo(MockRepository mocks)
{
var foo = mocks.StrictMock<IFoo>();
foo.myEvent += null;
var eventRaiser = LastCall.On(foo).IgnoreArguments().GetEventRaiser();
foo.DoSomething();
LastCall.On(foo).WhenCalled(i => eventRaiser.Raise(foo, EventArgs.Empty));
return foo;
}
अधिक फू उत्पन्न होते हैं, अधिकतर डेडलॉक होता है। यदि परीक्षण अवरुद्ध नहीं होगा, तो इसे कई बार चलाएं, और यह होगा। डिबगिंग testrun शो रोक, वह सब कार्य TaskStatus.Running में अब भी कर रहे हैं और वर्तमान कार्यकर्ता धागा
पर टूट रहा है [एक नींद में, प्रतीक्षा करें, या में शामिल होने के]
Rhino.Mocks.DLL! राइनो। Mocks.Impl.RhinoInterceptor.Intercept (Castle.Core.Interceptor.IInvocation मंगलाचरण) + 0x3d
अजीब बात है जो हमें सबसे confuses तथ्य यह है बाइट्स, कि अवरोधन के हस्ताक्षर (...) विधि सिंक्रनाइज़ के रूप में परिभाषित किया गया है - लेकिन कई थ्रेड यहां स्थित हैं। मैंने राइनो मोक्स और मल्टीथ्रेडेड के बारे में कई पोस्टिंग पढ़ी हैं, लेकिन चेतावनी नहीं मिली है (रिकॉर्ड की स्थापना की उम्मीद है) या सीमाएं।
[MethodImpl(MethodImplOptions.Synchronized)]
public void Intercept(IInvocation invocation)
क्या हम अपने मॉकोबजेक्ट्स को स्थापित करने या बहुसंख्यक वातावरण में उनका उपयोग करने पर पूरी तरह से कुछ गलत कर रहे हैं? किसी भी मदद या संकेत का स्वागत है!
मुझे यह पाया गया [http://blog.smithfamily.dk/post/2011/03/26/Thread-safe-version-of-Rhino-Mocks.aspx ](http://blog.smithfamily.dk/ पोस्ट/2011/03/26/थ्रेड-सेफ-वर्जन-राइनो-मोक्स.एएसपीएक्स) मेरी Google यात्रा पर। अफसोस की बात है कि वहां होस्ट किए गए संस्करण में एक बग है, इसलिए मैं नहीं देख सकता कि यह समस्या को हल करता है या नहीं। – jasper