2010-08-16 15 views
6

Piszę testy przeciwko naszemu mechanizmowi buforowania i chcę mieć pewność, że to, co trafia do pamięci podręcznej, jest takie samo, jak to, co wychodzi, tj. Że wszystkie właściwości są zgodne. Oto fikcyjna przykładem tego, jak chciałbym go do pracyWykonaj Assert.AreMatch(), aby dokładnie porównać właściwości w dwóch obiektach.

[Test] 
    public void add_client_model_member_to_cache_then_retreve() 
    { 
     //arrange 
     MemcachedClient client = new MemcachedClient(); 
     Member member = GetMember(); 
     client.Store(StoreMode.Set, "membertest", member); 

     // act 
     var result = client.Get<Member>("membertest"); 

     // assert 
     Assert.AreMatch(result, member); 
    } 

Nie jest możliwe, aby wykonać Assert.AreEqual na każdej nieruchomości, jak nie będzie wiele z tych testów z wielu właściwości w każdej.

Wow, dziękuję Jon. Myślę, że odpowiedziałeś na to w mniej niż minutę. Oto moje rozwiązanie dla wszystkich zainteresowanych stron. Zaimplementowałem tak, jak Jon zasugerował (jak sądzę), jednak miałem małe problemy z właściwościami tablicy i jako takie moje rozwiązanie obsługuje tylko tablice int (wszystko, czego obecnie potrzebuję).

To także musi być dość śliskie zbocze, jeśli spróbuję sprawdzić głębiej niż jeden poziom. Jestem pewien, że można to osiągnąć, ale dla moich celów nie jest to wymagane.

private bool AreMatch(object initial, object result) 
    { 
     if (initial.Equals(result)) 
      return true; 

     foreach (var property in initial.GetType().GetProperties()) 
     { 
      var initialPropValue = property.GetValue(initial,null); 
      var resultPropValue = result.GetType().GetProperty(property.Name).GetValue(result,null); 

      if (property.PropertyType.IsArray) 
      { 
       if ((initialPropValue != null && resultPropValue != null) && !Enumerable.SequenceEqual((int[])initialPropValue, (int[])resultPropValue)) 
         return false;     
      } 
      else if (!object.Equals(initialPropValue, resultPropValue)) 
      { 
       return false; 
      } 
      else if (initialPropValue != null && property.PropertyType.IsClass) 
      { 
       // Don't go deeper than one level, this got me into trouble 
       //if (!AreMatch(initialPropValue, resultPropValue)) 
       // return false; 
      } 
     } 
     return true; 
    } 

Powyższa metoda może być stosowana w następujących sytuacjach

[Test] 
    public void cached_result_is_same_as_original() 
    { 
     //arrange 
     Member member = GetMember(); 
     client.Store(StoreMode.Set, "membertest", member); 

     // act 
     var result = client.Get<Member>("membertest"); 

     // assert 
     Assert.IsTrue(AreMatch(member, result)); 
    } 

    [Test] 
    public void cached_result_is_same_as_original() 
    { 
     //arrange 
     Member member = GetMember(); 
     client.Store(StoreMode.Set, "membertest", member); 

     // act 
     var result = client.Get<Member>("membertest"); 
     result.FirstName = "Result is different"; 

     // assert 
     Assert.IsFalse(AreMatch(member, result)); 
    } 
+0

dowolne rozwiązanie? – Kiquenet

+0

Dołączyłem rozwiązanie, którego użyłem do pytania (patrz wyżej). Mogło ono zostać dodane do wielopoziomowego wsparcia w zakresie obsługi nieruchomości, ale nie było to wymagane i dość szybko się nie powiedzie. – CodeKiwi

Odpowiedz

3

dobrze, można z pewnością napisać coś rekursja przez wszystkich właściwości i wywołać object.Equals na skutek pobierania wartości właściwości z oczekiwane i rzeczywiste. Użyj Type.GetProperties(), aby uzyskać właściwości, a następnie PropertyInfo.GetValue, aby uzyskać wartość.

To będzie trochę prymitywne, ale zawsze możesz je poprawić, jeśli to konieczne.

Powiązane problemy