模擬オブジェクトを返すメソッドを(moqで)模擬する正しい方法は?
-
10-07-2019 - |
質問
正しいものはどれですか
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の方が簡単です:)
所属していません StackOverflow