2009-12-23 23 views
6

Alay için RhinoMocks kullanarak birim testleri yazıyorum ve şimdi daha önce kullanmadığım bazı yeni işlevlere ihtiyacım var.Geri çağırma tetikleyicilerini RhinoMocks ile kullanma

Bir işlev çağırmak istiyorum, bu yine bir zaman uyumsuzluğu işlevi çağırır. Async işlevinin yürütme sonucuyla belirtilen geri bildirimi bitirdiğini ve tetiklediğini simüle etmek için RhinoMocks'ta Geri Çağırma işlevini kullanabileceğimi farz ediyorum, ancak bunu nasıl yaparım? Yapmak istediklerinizi Temelde

böyle bir şeydir:

fakeSomething = MockRepository.GenerateMock<ISomething>(); 
fakeSomething.FictionousFunctionSettingCallback(MyFunctionCalled, MyCallback, theParameterToGiveCallback); 
var myObj = new MyClass(fakeSomething);  
myObj.Foo(); 
// Foo() now fires the function MyFunctionCalled asynchronous, 
// and eventually would trigger some callback 

Yani; Bunu kurmak için bu "FictionousFunction" ile değiştirebileceğim gerçek bir işlev var mı? Bu belirsiz olsaydı isteyiniz ..

cevap

12

Sadece WhenCalled kullanarak belirtin:

fakeSomething = MockRepository.GenerateMock<ISomething>(); 
fakeSomething 
    .Stub(x => x.Foo()) 
    .WhenCalled(call => /* do whatever you want */); 

örneğin çağrı Tartışmanın Argümanlar özelliğini kullanabilirsiniz:

fakeSomething 
    .Stub(x => x.Foo(Arg<int>.Is.Anything)) 
    .WhenCalled(call => 
    { 
    int myArg = (int)call.Arguments[0]; // first arg is an int 
    DoStuff(myArg); 
    }); 

O asenkron değil . Muhtemelen asenkronize olmak için buna ihtiyacınız yoktur, eğer olmasa bile hayatınızı kolaylaştırır.

+0

Teşekkürler! Bu sadece aradığım işlevsellik gibi geliyor. Noel burada beni yakalıyor, bu yüzden test etmeden önce birkaç gün beklemek zorundayım. Bazı takip sorularım olması durumunda cevabı kabul etmeyi bekliyorum. Tekrar teşekkürler! – stiank81

+0

Ve hayır - Bu kesinlikle testlerimde asenkron olmasını istemiyorum. Alay ettiğim işlevsellik eşzamansızdır, ancak senkronize bir şekilde taklit edeceğim - bu yüzden alay işlevi çağrıldığında başka bir işlev çağrısını tetiklemem gerekiyor. – stiank81

+0

Sonunda test etti. Bu sadece ihtiyacım olan şeydi! İyi çalışıyor - sadece fakeSomething .Stub (..) eklemeniz gerekir. Tekrar teşekkürler! – stiank81

İlgili konular