2010-08-16 31 views
6

Tôi đang viết kiểm tra đối với cơ chế Caching của chúng tôi và tôi muốn chắc chắn rằng những gì đi vào bộ nhớ cache giống như những gì xuất hiện, nghĩa là tất cả các thuộc tính đều khớp nhau. Dưới đây là một ví dụ hư cấu như thế nào tôi muốn nó hoạt độngThực hiện Assert.AreMatch() để so sánh sâu các thuộc tính trong hai đối tượng

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

Nó không phải là khả thi để thực hiện Assert.AreEqual trên mỗi tài sản như sẽ có rất nhiều những thử nghiệm với nhiều tài sản trong mỗi.

Wow, cảm ơn Jon. Tôi nghĩ rằng bạn đã trả lời rằng trong chưa đầy một phút. Đây là giải pháp kết quả của tôi cho bất kỳ bên quan tâm nào. Tôi thực hiện như Jon đề nghị (tôi nghĩ) tuy nhiên tôi đã gặp rắc rối nhỏ với các thuộc tính mảng và như vậy giải pháp của tôi chỉ xử lý mảng ints (tất cả tôi hiện đang yêu cầu).

Nó cũng phải là một độ dốc khá trơn nếu tôi cố gắng kiểm tra sâu hơn một cấp. Tôi chắc chắn điều này có thể đạt được tuy nhiên cho các mục đích của tôi nó không phải là bắt buộc.

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

Phương pháp trên có thể được sử dụng trong những tình huống sau

[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

bất kỳ giải pháp nào ?? – Kiquenet

+0

Tôi nối thêm giải pháp mà tôi đã sử dụng cho câu hỏi (xem ở trên) .. nó có thể được thêm vào để hỗ trợ traversal thuộc tính đa cấp, nhưng điều này không bắt buộc và có thể khá lộn xộn một cách nhanh chóng. – CodeKiwi

Trả lời

3

Vâng, bạn chắc chắn có thể viết một cái gì đó để recurse qua tất cả các tài sản, và gọi object.Equals vào kết quả lấy giá trị tài sản từ những dự kiến ​​và thực tế. Sử dụng Type.GetProperties() để tự lấy các thuộc tính và PropertyInfo.GetValue để nhận giá trị.

Nó sẽ hơi thô, nhưng bạn luôn có thể tinh chỉnh nếu cần.

Các vấn đề liên quan