2011-05-31 11 views
11

Tür parametresi olarak anonim bir tür kullanılarak çağrılacak genel bir yöntem koymalıyız. Gerçek telefon türü parametre olarak nesne ile yapıldı test edilen yöntemde <T>() .Report eğerRhino Mocks: Anonim bir türü yakalamak için genel bir yöntem nasıl eklenir?

interface IProgressReporter 
{ 
    T Report<T>(T progressUpdater); 
} 

// Unit test arrange: 
Func<object, object> returnArg = (x => x); // we wish to return the argument 
_reporter.Stub(x => x.Report<object>(null).IgnoreArguments().Do(returnArg); 

Bu çalışma, ancak gerçekte, yöntem, T, bir varlık olarak adlandırılır: düşünün anonim tip. Bu tür, test edilen yöntemin dışında mevcut değildir. Sonuç olarak, saplama asla çağrılmaz.

Tür parametresi belirtilmeksizin jenerik bir yöntem oluşturmak mümkün mü?

+0

biraz OT ama adsız yazılan bir nesneyi nasıl callee kullanıyor? Böyle bir kullanım vakası görmedim. Sadece burada jenerik bir yöntemin seçimini gözden geçirmeye çalışın .. – Gishu

+0

İyi soru;) Buradaki nokta, raporun argümanla herhangi bir şey yapması için değil, sadece geri dönmek için. LINQ ifadelerimizde zincirlemeyi kolaylaştırır. Bu yüzden, kesinlikle yeniden yazabiliriz, ama bir şeylerimiz olacağını düşünmüştük. –

+2

dedi. Aynı siparişe ve özellik türüne sahip başka bir anonim tür oluşturursanız, aynı türde olmalıdırlar. Belki bu size yardımcı olabilir .. testinde benzer bir kukla türü oluşturmak ve tür almak için üzerine bir GetType() yapmak ... ama daha önce söylediğim gibi .. karmaşık/zeki görünüyor. Basit tercih edilir :) – Gishu

cevap

4

Kullanım durumunuzda net değilim, ancak her bir test için Saplamayı ayarlamak için bir yardımcı yöntemini kullanabilirsiniz. Bu e-postanın testte Sonra

private void HelperMethod<T>() 
{ 
    Func<object, object> returnArg = (x => x); // or use T in place of object if thats what you require 
    _reporter.Stub(x => x.Report<T>(null)).IgnoreArguments().Do(returnArg); 
} 

çalışacak eğer RhinoMocks yüzden doğrulayamadığınız gelmiş yok yapın:

public void MyTest() 
{ 
    HelperMethod<yourtype>(); 
    // rest of your test code 
} 
0

sorunuza cevap için: Hayır, bir saplama mümkün değildir Rhino ile genel argümanları bilmeden jenerik yöntem. Genel argümanlar Rhino'daki yöntem imzasının önemli bir parçasıdır ve "Any" yoktur.

Davanızın en kolay yolu, sadece IProgressReporter kukla bir uygulama sağlayan bir elle yazılmış mock class yazmak olacaktır.

class ProgressReporterMock : IProgressReporter 
{ 
    T Report<T>(T progressUpdater) 
    { 
     return progressUpdater; 
    } 
}