2

其中哪一个是正确的?

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 是否会在幕后发挥作用,只是想验证一下 :)

4

1 回答 1

2

CreateTracer我想主要问题是如果它调用两次,你想发生什么。在第一个版本中,您将获得两种不同的模拟示踪剂;在第二个中,您将获得相同的两次。

第二个版本是我通常在 jMock、EasyMock 和 Rhino.Mocks 中使用的版本——但我没有任何使用 Moq 的经验,所以在那里使用第一个形式可能更习惯。第二个更简单,IMO :)

于 2009-08-02T07:07:41.603 回答