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)」)は範囲にマッチした場合に値を返すことができます