私は Moq を使用しており、ビルダー クラスを作成して、必要に応じてテスト セットアップ中にオーバーライドできる事前設定された合理的なデフォルトでモックを作成したいと考えています。私が採用したアプローチでは、入力パラメーター値と期待される出力を渡す拡張メソッドを使用します。そうすることで、意味的に同等のコードと思われるものに異なる動作が見られます.It.IsAny()をセットアップで直接渡すのと、It.IsAny()の値をセットアップで間接的に渡す. 例:
public interface IFoo
{
bool Bar(int value);
bool Bar2(int value);
}
public class Foo : IFoo
{
public bool Bar(int value) { return false; }
public bool Bar2(int value) { return false; }
}
var mock = new Mock<IFoo>();
mock.Setup(x => x.Bar(It.IsAny<int>())).Returns(true);
Assert.IsTrue(mock.Object.Bar(123)); // Succeeds
var myValue = It.IsAny<int>();
mock.Setup(x => x.Bar2(myValue)).Returns(true);
Assert.IsTrue(mock.Object.Bar2(123)); // Fails
両方の呼び出しは (私にとっては) 同等ですが、Bar2 への呼び出しはアサーションに失敗します。どうしてこれなの?