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

¿Fue útil?

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
scroll top