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主な問題は、 2 回呼び出された場合にどうしたいかということだと思います。最初のバージョンでは、2 つの異なるモック トレーサーを取得します。2番目に同じものを2回取得します。

2 番目のバージョンは、jMock、EasyMock、Rhino.Mocks で通常使用したものですが、Moq の経験がないため、最初の形式を使用する方が慣用的かもしれません。2番目は簡単ですが、IMO :)

于 2009-08-02T07:07:41.603 に答える