1. ホーム
  2. c#

[解決済み] 複数のMoq It.Is<string>()マッチング引数

2023-04-20 02:39:39

質問

Moq では、複数の Matching Argument を持つことは有効ですか。

It.Is<string>() 

この例では、mockMembershipServiceが、与えられたUserに応じて異なるProviderUserKeyを返すようにしたいのです。

mockMembershipService.Setup(
    x => x.GetUser(
      It.Is<string>(
        s => s.Contains("Joe")))
   .ProviderUserKey)
.Returns("1234abcd");


mockMembershipService.Setup(
  x => x.GetUser(
    It.Is<string>(
      s => s.Contains("Tracy")))
  .ProviderUserKey)
.Returns("5678efgh");

SetUpは、それぞれの長所を評価するのではなく、2番目のステートメントをデフォルトとします。

どのように解決するのですか?

混乱しませんか?GetUserメソッドをモックしようとしているのに、その関数の戻り値のプロパティにReturnsを設定しているのです。また、モックされたメソッドに基づいて戻り値の型のプロパティを記述したいのです。

もっとわかりやすい方法を紹介します。

mockMembershipService.Setup(x => x.GetUser(It.IsAny<string>())
                     .Returns<string>(GetMembershipUser);

メンバーシップモックを作成するメソッドを紹介します。

private MembershipUser GetMembershipUser(string s)
{
    Mock<MembershipUser> user =new Mock<MembershipUser>();
    user.Setup(item => item.ProviderUserKey).Returns(GetProperty(s));
    return user.Object;
}

そして、そのプロパティを設定するためのメソッドを書きます。

private string GetProperty(string s)
{
    if(s.Contains("Joe"))
        return "1234abcd";
    else if(s.Contains("Tracy"))
        return "5678efgh";
}