¿La forma correcta de simular (con moq) métodos que devuelven objetos simulados?
-
10-07-2019 - |
Pregunta
¿Cuál de estos es correcto?
var mockLogger = new Mock<EntLibLogger>();
mockLogger.Setup(i => i.CreateTracer(It.IsAny<string>()))
.Returns((string operationName) =>
{
var mockTracer = new Mock<EntLibTracer>(operationName);
mockTracer.Setup(i => i.IsTracingEnabled())
.Returns(true);
mockTracer.CallBase = true;
return mockTracer.Object;
});
mockLogger.CallBase = true;
//EntLibLogger.Current is a singleton that is shared across multiple threads.
//This Initialize method will set EntLibLogger.Current to the mocked instance
//instead of the default (non-mocked) configuration
EntLibLogger.Initialize(mockLogger.Object);
O
var mockTracer = new Mock<EntLibTracer>(operationName);
mockTracer.Setup(i => i.IsTracingEnabled())
.Returns(true);
mockTracer.CallBase = true;
var mockLogger = new Mock<EntLibLogger>();
mockLogger.Setup(i => i.CreateTracer(It.IsAny<string>()))
.Returns(mockTracer.Object);
mockLogger.CallBase = true;
EntLibLogger.Initialize(mockLogger.Object);
Creo que el primer enfoque es correcto, pero no estoy seguro de si Moq podría estar haciendo algo de magia bajo el capó y solo quería validar :)
Solución
Supongo que la pregunta principal es qué quieres que suceda si llama a CreateTracer
dos veces. En la primera versión, obtendrás dos simuladores de rastreo diferentes; en el segundo obtendrás el mismo dos veces.
La segunda versión es la que usualmente uso en jMock, EasyMock y Rhino.Mocks, pero no tengo ninguna experiencia con Moq, por lo que puede ser más idiomático usar la primera formar allí. El segundo es más simple, IMO :)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow