O caminho certo para zombar (com MOQ) métodos que retornam objetos ridicularizado?
-
10-07-2019 - |
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:)
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