哪一个是正确的?

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是否可能会在幕后做一些魔术而只是想验证:)

有帮助吗?

解决方案

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top