2010-12-10 17 views
18

Supongamos que tengo alguna de las interfaces con un método genérico y no hay parámetros:métodos genéricos burlando de

public interface Interface { 
    void Method<T>(); 
} 

Yo quisiera poner en práctica la maqueta de esta clase (estoy usando Moq) y deseo de burlarse de este método para un tipo concreto, digamos que me estoy burlando de las llamadas Method<String>().

mock = new Mock<Interface>(); 
mock.Setup(x => x.Method ????).Returns(String("abc")); 

La idea de ???? debe quedar claro - esta expresión lambda debe tratar el caso en T en el Method<T> es en realidad un String.

¿Hay alguna forma en que pueda lograr el comportamiento deseado?

Respuesta

20

Simplemente:

mock.Setup(x => x.Method<string>()).Returns("abc"); 

también asegúrese de que su método en realidad vuelve algo tan actualmente el tipo de retorno se define como void:

public interface Interface 
{ 
    string Method<T>(); 
} 

class Program 
{ 
    static void Main() 
    { 
     var mock = new Mock<Interface>(); 
     mock.Setup(x => x.Method<string>()).Returns("abc"); 

     Console.WriteLine(mock.Object.Method<string>()); // prints abc 
     Console.WriteLine(mock.Object.Method<int>()); // prints nothing 
    } 
} 
+0

No debería 'cadena Método ' be 'T Método '? – Scott

+1

@Secret Agent Man, no, no debería. Al menos no hay nada que lo obligue a hacerlo. Fue solo un ejemplo que tomé. Un método puede devolver lo que quieras. Si lo desea, puede reemplazar el tipo de retorno 'string' con' T', el ejemplo seguirá funcionando. –

5

No he utilizado Moq mí mismo, pero me gustaría esperar:

mock.Setup(x => x.Method<string>()); 

(Tenga en cuenta que el método de la muestra tiene un tipo de retorno void, por lo que no debería devolver nada ...

+0

En cuyo caso la configuración es innecesaria ya que el simulacro se crea en modo suelto. –