2009-08-02 9 views
2

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

Répondre

2

Je suppose que la question principale est ce que vous voulez arriver s'il appelle CreateTracer deux fois. Dans la première version, vous obtiendrez deux traceurs simulateurs différents; dans la seconde vous aurez le même deux fois.

La deuxième version est ce que je suis habituellement utilisé dans jMock, EasyMock et Rhino.Mocks - mais je n'ai aucune expérience avec Moq, il peut être plus idiomatiques d'utiliser la première forme là-bas. La seconde est plus simple cependant, IMO :)

+0

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. –

Questions connexes