2016-03-18 18 views
1

Bir API denetleyici yönteminin, yalnızca Name numaralı Name = FirstName + ' ' + LastName numaralı bağlantıyı temel alan kullanıcılara (artı burada ilgili olmayan bazı ek durumlar) döndüğünü test etmeye çalışıyorum.Sonuçları bir parametrenin değerini temel alarak dinamik olarak döndüren bir aldatmacayı nasıl kurarım?

GetUsersByName(name) yöntemini gösteren bir depom var. Kullanıcıların bir dizi kullanıcı listesinden (this.testUsers) isim ölçütleriyle eşleşen bir List<UserModel> kullanıcı döndürecek olan bu depo yöntemi için bir kurulum yapmak istiyorum.

aşağıdaki denedim:

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()); 

ama geri ben maç için moq söylüyorum IsAny<string> için maddeyi içerir kravat nasıl bilmiyorum.

Bu mümkün mü? IsAny'ye bir parametre vermem gerektiğinden şüpheleniyorum ama benzer örnekler bulamıyorum.

+0

Bu şekilde dalga geçmeniz gereken gerçekten% 100 emin değilim. API denetleyicinizde, havuzunuz tarafından döndürülen verilere bağlı olarak hayati bir mantık var mı? Örneğin. depo veri döndürürse, bu duruma uymazsa, API denetleyicisinde kullanır mısınız? –

+2

@ NKosi'nin yanıtı aşağıdaki gibidir, ancak bir kural olarak, alaycı bir davranış içinde çok fazla mantıktan kaçınmalısınız. Rastgele değerleri SetUp'dan döndürür ve bu değerlere dayanarak veririm. Sadece bir düşüncem gerçek senaryonuzu bilmiyorum. –

+0

@Nasmi Sabeer Genel olarak kabul ediyorum, ancak bu özel yöntem değerleri belirli kriterlere göre döndürmelidir. Bu kriterleri önceden tanımlamazsam, test çalıştırıldığında ihtiyaç duyduğum tüm varyasyonlarda bulunacağından emin olamam. – Necoras

cevap

1

Evet, bu mümkün. Sen

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)); 

Uzun çağırma Cevap için argümanlar alınırken, yönteminden dönmek için değerini hesaplamak bir işlev belirtir Returns<string> kullanabilirsiniz

Neyin peşinde olduğunuzu yeniden oluşturmak için örnek bir test yapılandırabiliyordum.

[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

Fantastik. Yakın olduğumu biliyordum ama son iki parçaya ihtiyacım vardı. Teşekkürler. – Necoras

İlgili konular