moqとのマッチングのために、かなり複雑な式ツリーの作成を単純化しようとすると、私はいくつかの奇妙な動作に遭遇しました。
私が下に定義されている単純なインタフェースを嘲笑していると仮定します
public interface IService
{
int Send(int value);
}
次のコードは5つのテストを表しています。 mockSender.Setup(...)
のそれぞれに対して1つのテスト。失敗したとマークされたテストが失敗する理由を誰でも説明できますか?
[Test]
public void TestInlineSetup()
{
const int expected = 5;
var mockSender = new Mock(MockBehavior.Loose);
//passes
mockSender.Setup(s => s.Send(It.IsAny())).Returns(expected);
//fails
var sendMatch = It.IsAny();
mockSender.Setup(s => s.Send(sendMatch)).Returns(expected);
//passes
mockSender.Setup(s => s.Send(SendMatchFromMethod())).Returns(expected);
//fails
var sendMatch = SendMatchFromMethod();
mockSender.Setup(s => s.Send(sendMatch)).Returns(expected);
//fails (this is somewhat contrived, but I have reasons for wanting to curry this)
mockSender.Setup(s => s.Send(SendMatchFromCurriedMethod()())).Returns(expected);
Assert.That(mockSender.Object.Send(expected), Is.EqualTo(expected));
}
public static int SendMatchFromMethod()
{
return It.IsAny();
}
public static Func SendMatchFromCurriedMethod()
{
return() => It.IsAny();
}
Edit: I know about Mock.Of<..>(..) and normally prefer to use it but in this case it is not an option.