Pergunta

Qual destes é correto?

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

Eu acredito que a primeira abordagem é correta, mas não tenho a certeza se Moq poderia estar fazendo alguma magia sob o capô e só queria validar:)

Foi útil?

Solução

Eu acho que a principal questão é o que você quer que aconteça se chama CreateTracer duas vezes. Na primeira versão você terá dois traçadores simuladas diferentes; no segundo você obterá o mesmo duas vezes.

A segunda versão é o que eu normalmente usado em jMock, EasyMock e Rhino.Mocks - mas eu não tenho nenhuma experiência com Moq, assim que pode ser mais idiomática para usar a primeira formar ali. A segunda é mais simples, porém, IMO:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top