2009-08-02 6 views
2

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

Antwort

2

Ich denke, Die Hauptfrage ist, was Sie passieren wollen, wenn es zweimal CreateTracer aufruft. In der ersten Version erhalten Sie zwei verschiedene Scheintracer; in der Sekunde bekommst du das gleiche zweimal.

Die zweite Version ist das, was ich in der Regel in JMock, EasyMock und Rhino.Mocks verwendet habe - aber ich habe keine Erfahrung mit Moq, so dass es kann mehr idiomatische es die erste Form zu verwenden. Die zweite ist einfacher, IMO :)

+0

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

Verwandte Themen