哪一个是正确的?
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);
OR
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);
我相信第一种方法是正确的,但我不确定Moq是否可能会在幕后做一些魔术而只是想验证:)
答案 0 :(得分:2)
我想主要问题是如果它两次调用CreateTracer
你想要发生什么。在第一个版本中,您将获得两个不同的模拟跟踪器;在第二个你会得到相同的两次。
第二个版本是我在jMock,EasyMock和Rhino.Mocks中经常使用的版本 - 但是我对Moq没有任何经验,所以可能更习惯于使用第一个版本在那里形成。第二个更简单,IMO:)