2012-02-23 1 views
9

per deridere un metodo protetto virtuale (non generica) in Moq è facile:derisione un metodo generico protetto con Moq

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

E per deridere esso:

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

non riuscivo a trovare un modo di usare la stessa tecnica se il metodo protetto è generico, come:

protected virtual int MyMethod<T>(T data) 

Qualsiasi idea di come farlo, oltre ad utilizzare una classe wrapper per overri de quel metodo, è molto apprezzato.

+0

Non so se è possibile. La prima cosa che ho provato è stata passare MyMethod'1 [T] a Setup(), ma non sembrava ingannarlo. Potresti provare a giocare con quello, comunque. –

risposta

6

Ho controllato la fonte e sembra beffardo metodi generici protetti con Moq non è supportato:

Il metodo Protected() crea un'istanza di una classe ProtectedMock<T> che utilizza il seguente metodo per ottenere il metodo che si voler deridere:

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

utilizza Type.GetMethod per ottenere il metodo di scherno, ma GetMethod (anche se MSDN afferma in modo diverso) non giocare piacevole con i generici, vedi:

GetMethod for generic method

Get a generic method without using GetMethods

Nota a margine: A mio parere beffardo un membro protetto è un odore di codice, e avrei preferito cercare di evitare in ogni caso con il refactoring mio disegno (oltre che non è supportato in Moq).

+0

Sono totalmente d'accordo con il codice olfattivo. Ma a volte in uno scenario più complesso questo può facilitare il test. Cioè se si dispone di funzionalità molto "simili" per un sacco di metodi, e si vuole veramente verificare che le parti esposte pubblicamente facciano una mappatura corretta dei parametri per passarle. –