2016-03-18 11 views
1

私は、APIコントローラメソッドがNameに基づいて一致するユーザー(およびここでは関係のないいくつかの追加の状態)を返すことを試しています。ここで、Name = FirstName + ' ' + LastNameです。パラメータの値に基づいて結果を動的に返すモックを設定するにはどうすればよいですか?

私はGetUsersByName(name)メソッドを公開するリポジトリを持っています。そのスタジオのユーザリスト(this.testUsers)の名​​前の基準に一致するユーザを含むList<UserModel>を返すリポジトリメソッドの設定を模擬したいと思います。

は、私は、次の試してみた:

this.mockUserReposiotry.Setup(r => r.GetAllUsersByName(It.IsAny<string>())) 
    .Returns(this.mockUtilities.MockUpUserModel(this.testUsers).Where(u => string.Concat(
     u.firstName, " ", u.lastName) 
     .ToLower().Contains()); 

が、私は戻って私が一致するMOQを言っているIsAny<string>の句が含まれています結びつける方法がわかりません。

これは可能ですか?私は、IsAnyにパラメータを提供する必要があると考えていますが、同様の例は見つかりません。

+0

私は100%確信していません。あなたは本当にこのようにモックする必要があります。 APIコントローラには、リポジトリから返されるデータに依存する重要なロジックがありますか?例えば。リポジトリが条件に合わないデータを返す場合は、APIコントローラで処理しますか? –

+2

@ Nkosiの答えは正しいですが、経験則として、嘲笑された振る舞いの中であまりにも多くの論理を避けるべきです。私はSetUpから任意の値を返し、それらの値に基づいてアサートします。あなたの実際のシナリオはわかりません。 –

+0

@Nasmi Sabeer一般的に私は同意しますが、この特定のメソッドは特定の基準に基づいて値を返す必要があります。これらの基準をあらかじめ定義していない場合は、テストを実行する際に必要なすべてのバリエーションにそれらが存在することは確信できません。 – Necoras

答えて

1

はい可能です。あなたは

this.mockUserReposiotry.Setup(r => r.GetAllUsersByName(It.IsAny<string>())) 
    .Returns<string>(originalParameter => this.mockUtilities.MockUpUserModel(this.testUsers).Where(u => string.Concat(
     u.firstName, " ", u.lastName) 
     .ToLower().Contains(originalParameter)); 

ロング呼び出し回答の引数を取得し、メソッドから返される値を計算する関数を指定しますReturns<string>を使用することができます

私はあなたが何をしているかを再現するためのサンプルテストを構築することができました。

[TestClass] 
public class DynamicResultsTests { 
    List<UserModel> testUsers = new List<UserModel>(); 
    string[] names = new[] { "John Doe", "Jane Doe", "Jack Sprat", "John Smith", "Mary Jane" }; 

    [TestInitialize] 
    public void Init() { 
     testUsers = names.Select(n => { 
      var tokens = n.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries); 

      return new UserModel { firstName = tokens[0], lastName = tokens[1] }; 
     }).ToList(); 
    } 

    [TestMethod] 
    public void Test_ShouldDynamicallyReturnResultsBasedOnParameterValue() { 
     //Arrange 
     string parameterValue = "john"; 

     Func<string, UserModel, bool> predicate = (s, u) => string 
       .Join(" ", u.firstName, u.lastName) 
       .IndexOf(s, StringComparison.InvariantCultureIgnoreCase) > -1; 

     Func<string, List<UserModel>> valueFunction = s => 
      this.testUsers.Where(u => predicate(s, u)).ToList(); 

     var mockUserRepository = new Mock<IUserRepository>(); 
     mockUserRepository 
      .Setup(r => r.GetAllUsersByName(It.IsAny<string>())) 
      .Returns<string>(valueFunction); 

     var repository = mockUserRepository.Object; 

     //Act 
     var users = repository.GetAllUsersByName(parameterValue); 

     //Assert (There should be 2 results that match john) 
     users.Should().NotBeNull(); 
     users.Should().NotBeEmpty(); 
     users.Count().Should().Be(2); 
    } 

    public interface IUserRepository { 
     List<UserModel> GetAllUsersByName(string name); 
    } 

    public class UserModel { 
     public string firstName { get; set; } 
     public string lastName { get; set; } 
    } 
} 
+0

すばらしい。私は近くにいることは分かっていましたが、最後の2つが必要でした。ありがとう。 – Necoras

関連する問題