Question

Laquelle de ces réponses est correcte?

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 pense que la première approche est correcte mais je ne suis pas sûr que Moq puisse faire quelque chose de magique sous le capot et je voulais juste valider:)

Était-ce utile?

La solution

Je suppose que la question principale est de savoir ce que vous voulez qu'il se passe s'il appelle CreateTracer deux fois. Dans la première version, vous aurez deux simulateurs de traçage différents; dans le second, vous obtiendrez deux fois le même.

La deuxième version correspond à ce que j’ai l'habitude d'utiliser dans jMock, EasyMock et Rhino.Mocks - mais je n'ai aucune expérience de Moq, il est donc plus plus idiomatique d'utiliser la première. forme là. La seconde est plus simple, IMO:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top