2010-08-16 74 views
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)); 
    } 
+0

任何解決方案?? – Kiquenet 2010-12-17 12:04:09

+0

我附加了我用於問題的解決方案(請參閱上文)。它可以添加到多級屬性遍歷支持中,但這不是必需的,可以相當快速地變得相當混亂。 – CodeKiwi 2010-12-20 03:52:34

回答

3

很好地使用,你當然可以寫的東西通過所有屬性遞歸,並取出由屬性值調用的結果object.Equals預期的和實際的。使用Type.GetProperties()來獲取屬性本身,並使用PropertyInfo.GetValue來獲取該值。

它會有點粗糙,但你可以隨時調整它,如果有必要。