Itクラスによる引数の条件制御
ここからは、IGreetingインタフェースを例に見ていきます。Printメソッドは引数に応じて、「おはよう」や「Hello」などの挨拶を返します。
挨拶をするIGreetingインタフェースのPrintメソッド
public interface IGreeting
{
string Print(string param);
}
Calcクラスの例ではメソッドの引数パターンを全て登録しましたが、以下のIGreetingのモックコードでは、Itクラスを使うことで条件を柔軟に設定しています。
Itクラスによる引数の条件指定(テストにパスします)
[TestMethod()]
public void PrintTest()
{
//引数が何でも良い場合(IsAny)
var mock1 = new Mock<IGreeting>();
mock1.Setup(m => m.Print(It.IsAny<string>())).Returns("おはよう");
//確認
Assert.AreEqual("おはよう", mock1.Object.Print("あ"));
Assert.AreEqual("おはよう", mock1.Object.Print("123"));
//引数を正規表現で指定(IsRegex)
var mock2 = new Mock<IGreeting>();
mock2.Setup(m => m.Print(It.IsRegex("^(ja|jp)$")))
.Returns("こんにちは");
//確認
Assert.AreEqual("こんにちは", mock2.Object.Print("ja"));
Assert.AreEqual("こんにちは", mock2.Object.Print("jp"));
Assert.AreEqual(null, mock2.Object.Print("xxx"));
//引数を式で指定(Is)。引数を小文字にしてenで始まる場合
var mock3 = new Mock<IGreeting>();
mock3.Setup(m => m.Print(It.Is&<string>(s => s.ToLower().StartsWith("en"))))
.Returns("Hello");
//確認
Assert.AreEqual("Hello", mock3.Object.Print("En"));
Assert.AreEqual("Hello", mock3.Object.Print("EN-US"));
Assert.AreEqual(null, mock3.Object.Print("xen"));
}
上のコードではPrintメソッドの引数部分に注目してください。
It.IsAnyでは引数の内容に関わらず全てをマッチさせることができます。つまり、引数がどんな文字列であってもReturnの設定値を返します。It.IsRegexは正規表現にマッチした場合、It.Isは式の条件にマッチした場合、It.IsInRange(1から5の例:「It.IsInRange(1, 5, Range.Inclusive)」)は範囲にマッチした場合に値を返すことができます