2011-11-08 13 views
11

Estoy usando MOQ para simular una llamada a un método con una lista de resultados esperados. Mi método devuelve una lista, pero quiero que el simulacro haga una nueva lista cada vez que se llame al método. Lo que he hecho hasta ahora:Cómo hacer que Mock devuelva una nueva lista cada vez que se llama al método usando Moq

List<Correlation> expected = new List<Correlation> { new Correlation() { Code = "SelfError1" }, new Correlation() { Code = "SelfError2" } }; 
Mock<IRPLValidator> selfMock = new Mock<IRPLValidator>(); 
selfMock.Setup(f => f.Validate()).Returns(expected); 

Lo que estoy tratando de lograr es hacer que el simulacro de retorno de una nueva lista cada vez que el método get de llama. He intentado esto, pero no funcionó:

selfMock.Setup(f => f.Validate()).Returns(new List<Correlation>{ new Correlation() { Code = "SelfError1" }, new Correlation() { Code = "SelfError2" } }); 

Como esto no funcionó, Estoy pensando que tal devolución de llamada es la respuesta a mi pregunta, pero no he encontrado ningún ejemplo adecuado para reinicializar mi lista . ¿Alguna sugerencia?

Como puede que se pregunte por qué necesito una nueva lista cada vez, el problema es que llamo al método sobre diferentes tipos de objetos haciendo algunos cambios en la lista, dependiendo del tipo de objeto. Debido a que el simulacro me da la misma lista cada vez que se llama al método, siempre estoy modificando el mismo objeto en la memoria, así no puedo seguir los cambios que estoy haciendo en él.

¡Gracias de antemano!

Respuesta

14
selfMock.Setup(f => f.Validate()).Returns(() => new List<Correlation>{ new Correlation() { Code = "SelfError1" }, new Correlation() { Code = "SelfError2" } }); 

Debe convertir el valor dentro de las devoluciones en una función. La versión que probaste creó una sola lista, luego regresa y la usaste. De esta manera, la lista se crea cada vez que las devoluciones llamarán a la función cada vez que se necesite.

+0

¡Funcionó como un encanto! Muchas muchas gracias. Eso fue tan fácil. –

+0

Gracias - un día tendré todo este asunto del cierre. – David

+0

Ojalá hubiera encontrado esto antes, perdí un día ayer preguntándome por qué mi lista no se actualizaba. ¡¡¡Gracias!!! – PmanAce

2

Return toma un Func <> (y varias sobrecargas) delegar como parámetro de entrada, por lo tanto puede especificar no solo algunos datos dentro del método de Retorno que se devolverá como parámetro sino también funciones, que se ejecutarán y el resultado del la función será devuelta. La solución provista por Rangoric funcionará bien en su caso.

+0

¡Gracias por la explicación! –

Cuestiones relacionadas