2012-02-23 26 views
9

ile korunan bir jenerik yöntem alaycı kolaydır:Adedi te koruma sanal (non-generic) yöntemini alay etmek MOQ

public class MyClass 
{ 
.... 
     protected virtual int MyMethod(Data data){..} 
} 

Ve ister alay etmek:

myMock.Protected().Setup<int>("MyMethod", ItExpr.Is<Data>(... 

Ben bulamadım korumalı yöntem gibi, jenerik ise yolu aynı tekniği kullanmak:

protected virtual int MyMethod<T>(T data) 

overri bir sarmalayıcı sınıf kullanarak yanında, bunu nasıl herhangi bir fikir Bu yöntem de, çok takdir edilmektedir.

+0

Yapabileceğinden emin değilim. Denediğim ilk şey, MyMethod'1 [T] 'yi Setup()' a geçirmekti, ama bu onu kandıramadı. Yine de bununla oynamayı deneyebilirsin. –

cevap

6

Kaynağını kontrol ettik ve onu MOQ ile korunan jenerik yöntemleri alay görünüyor desteklenmez:

Protected() yöntem yöntemini almak için aşağıdaki yöntemi kullanan bir sınıfın ProtectedMock<T> bir örneğini oluşturur seni alay etmek istiyorum: (MSDN farklı devletler rağmen) jenerik güzel oynamaz

private static MethodInfo GetMethod(string methodName, params object[] args) 
{ 
    return typeof(T).GetMethod(
      methodName, 
      BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, 
      null, 
      ToArgTypes(args), 
      null); 
} 

Bu alay için bir yöntem elde etmek Type.GetMethod kullanır, ancak GetMethod, bkz:

GetMethod for generic method

Get a generic method without using GetMethods

Yan Not: Korunan üye alay Bence bir kod koku olduğunu ve daha çok Moq desteklenmeyen o yanında (tasarımımı üstlenmeden ile yine de önlemek çalışacaktı).

+0

Kod kokusuna tamamen katılıyorum. Ancak bazen daha karmaşık bir senaryoda bu, testi kolaylaştırabilir. Yani Bir sürü yöntem için çok "benzer" bir işleve sahipseniz ve gerçekten sadece kamuya açık kısımların doğrulanması için parametreleri doğru bir şekilde haritalamak istediğinizi doğrulayın. –

İlgili konular