模擬オブジェクトを返すメソッドを(moqで)模擬する正しい方法は?

StackOverflow https://stackoverflow.com/questions/1218302

質問

正しいものはどれですか

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top