哪一个是正确的?
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);
或
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 是否在幕后做了一些魔术并且只是想验证 :)
我想主要的问题是,如果它调用 CreateTracer
两次,您想发生什么。在第一个版本中,您将获得两个不同的模拟示踪剂;在第二个你会得到相同的两次。
第二个版本是我通常在 jMock、EasyMock 和 Rhino.Mocks 中使用的版本 - 但我没有任何 Moq 经验,所以使用第一个版本可能更符合习惯在那里形成。第二个更简单,IMO :)
我是一名优秀的程序员,十分优秀!