Welche davon ist richtig?Der richtige Weg, um (mit moq) Methoden zu verspotten, die verspottete Objekte zurückgeben?
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);
ODER
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);
Ich glaube, der erste Ansatz richtig ist, aber ich bin nicht sicher, ob Moq vielleicht etwas Magie unter der Haube tun und wollte nur bestätigen :)
Ich stimme der Verwendung der zweiten Option für die Einfachheit. Nesten lambdas sind schwer zu lesen. Wenn Sie jedes Mal ein neues haben möchten, können Sie die erste Option verwenden, aber den inneren Ausdruck extrahieren und ihm einen guten Namen geben. –