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));
}
dowolne rozwiązanie? – Kiquenet
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