6
我正在編寫針對我們的緩存機制的測試,並且我想確保進入緩存的內容與出現的相同,即所有屬性都匹配。下面是我怎麼想它的工作執行Assert.AreMatch()深入比較兩個對象中的屬性
[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);
}
這是不可行的各財產進行Assert.AreEqual一樣會有許多測試,在每個許多屬性的一個虛構的例子。
哇,謝謝Jon。我想你在一分鐘內回答了。這是我爲任何感興趣的人士提供的解決方案。我按照Jon的建議(我認爲)實現,但是我遇到了數組屬性的一些問題,因此我的解決方案只處理int數組(我目前需要)。
如果我試圖檢查比一個層次更深的話,它也會變得相當滑溜。我相信這可以實現,但爲了我的目的,這不是必需的。
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;
}
上述方法,可在下列情況下
[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));
}
任何解決方案?? – Kiquenet 2010-12-17 12:04:09
我附加了我用於問題的解決方案(請參閱上文)。它可以添加到多級屬性遍歷支持中,但這不是必需的,可以相當快速地變得相當混亂。 – CodeKiwi 2010-12-20 03:52:34