2011-05-31 9 views
11

Necesitamos encontrar un método genérico que se llamará utilizando un tipo anónimo como parámetro de tipo. Considerar:Rhino Mocks: ¿Cómo un método genérico para capturar un tipo anónimo?

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); 

Esto funcionaría si la llamada real para .report <T>() en el método bajo prueba se hizo con objeto como el parámetro de tipo, pero en realidad, el método se denomina con T siendo una tipo anónimo Este tipo no está disponible fuera del método bajo prueba. Como resultado, el talón nunca se llama.

¿Es posible insertar un método genérico sin especificar el parámetro de tipo?

+0

OT un poco, pero ¿cómo consume el destinatario un objeto de tipo anónimo? Nunca he visto un caso de uso así. Solo estoy tratando de revisar la elección de un método genérico aquí. – Gishu

+0

Buena pregunta;) El punto no es que el método Informe haga algo con el argumento, solo para devolverlo. Facilita el encadenamiento en nuestras expresiones LINQ. Como tal, ciertamente podemos reescribirlo, pero pensamos que tendríamos una oportunidad. –

+2

dicho eso. Si crea otro tipo anónimo con el mismo orden y tipo de propiedades, deben ser del mismo tipo. Tal vez eso pueda ayudarlo ... crear un tipo simulado similar en su prueba y hacer un GetType() en él para recuperar el tipo ... pero como dije antes ... se ve intrincado/inteligente. Simple es preferido :) – Gishu

Respuesta

4

No estoy seguro de su caso de uso, pero es posible que pueda utilizar un método de ayuda para configurar el Stub para cada prueba. No tengo RhinoMocks así han podido verificar si esto funcionará

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); 
} 

Luego, en la prueba de hacer:

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

Para responder a su pregunta: no, no es posible un código auxiliar método genérico sin conocer los argumentos genéricos con Rhino. Los argumentos genéricos son una parte esencial de la firma del método en Rhino, y no hay ningún "Cualquiera".

La manera más fácil en su caso sería simplemente escribir una clase simulada escrita a mano, que proporciona una implementación ficticia de IProgressReporter.

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