Lequel de ces éléments est correct?La bonne façon de simuler (avec moq) des méthodes qui retournent des objets raillés?
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);
OU
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);
Je crois que la première approche est correcte mais je ne suis pas sûr si Moq pourrait faire un peu de magie sous le capot et je voulais juste valider :)
Je suis d'accord avec l'utilisation de la deuxième option pour la simplicité. Nesten lambdas sont difficiles à lire. Si vous en voulez un nouveau à chaque fois, vous pouvez utiliser la première option, mais extraire l'expression interne et lui donner un bon nom. –