Şu anda Birim Testi sırasında bazı sorunlarla karşılaşıyoruz. Sınıfımız, Rhino Mocks kullanarak Mocked nesneler üzerinde bazı işlev çağrılarını multithreading. Çok iş parçacıklı kod, Rhino Mocks'ın bir Deadlock neden olmasına neden olur
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());
}
}
Arayüz IFoo
olarak tanımlanır:public interface IFoo
{
void DoSomething();
event EventHandler myEvent;
}
kilitlenme yeniden oluşturmak için bizim unittest şunları yapar: İşte minimuma indirgenmiş bir örnek 1. Bazı IFoo dalga geçer 2 oluşturun. DoSomething() çağrıldığında MyEvent öğesini kaldırın.
[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;
}
Daha fazla Foo üretilir, daha sık kilitlenme oluşur. Test engellenmezse, birkaç kez çalıştırın ve olacak. Bütün Görevler TaskStatus.Running hala ve mevcut çalışan iş parçacığı
de kırılma olduğunu, ayıklama testrun gösterileri durdurma
Rhino.Mocks.DLL! Rhino [uykuya olarak, bekleyin veya katılmak].
gerçeği bizi en karıştırır olan garip bir şey bayt 0x3d Mocks.Impl.RhinoInterceptor.Intercept (Castle.Core.Interceptor.IInvocation çağırma) +, o kesişimi imza (...) Yöntem Senkronize olarak tanımlanır - ancak birkaç konu burada bulunur. Rhino Mocks ve Multithreaded hakkında birkaç gönderi okudum, ancak uyarılar (kayıtların ayarlanması bekleniyor) veya sınırlamalar bulamadı.
[MethodImpl(MethodImplOptions.Synchronized)]
public void Intercept(IInvocation invocation)
Mockobject'leri ayarlamak veya bunları çok iş parçacıklı bir ortamda kullanmak konusunda tamamen yanlış bir şey yapıyor muyuz? Herhangi bir yardım veya ipucu açığız!
Bunu buldum [http://blog.smithfamily.dk/post/2011/03/26/Thread-safe-version-of-Rhino-Mocks.aspx](http://blog.smithfamily.dk/ google seyahatlerimde/2011/03/26/Thread-safe-version-of-Rhino-Mocks.aspx). Ne yazık ki, orada barındırılan sürümde bir hata var gibi görünüyor, bu yüzden sorunu çözüp görmediğini göremiyorum. – jasper