2012-03-13 18 views
6

Tôi đang chạy một kiểm tra, nhưng nếu không tôi không biết lý do tại sao:NUnit. Giá trị khác tại chỉ số [0]

Proj.Tests.StatTests.GetResults_RegularPage_ReturnListOfResults: 
    Expected and actual are both <System.Collections.Generic.List`1[Proj.Classes.StatResult]> with 50 elements 
    Values differ at index [0] 
    Expected: <test;98318> 
    But was: <test;98318> 

Như bạn có thể thấy giá trị giống hệt nhau. Dưới đây là một số mã:

public class StatResult 
    { 
     public string word { get; set; } 
     public UInt64 views { get; set; } 

     public override string ToString() 
     { 
      return String.Format("{0};{1}", word, views);     
     } 
    }  

    [Test] 
    public void GetResults_RegularPage_ReturnListOfResults() 
    { 
     // Arrange    
     WordStat instance = new WordStat(Constants.WordStatRegularPage); 
     // Act 
     List<StatResult> results = instance.GetResults(); 
     // Assert 
     Assert.AreEqual(results, new List<StatResult> 
     { 
      new WordStatResult { word ="test", views = 98318}, 
      new WordStatResult { word ="test board", views = 7801}, 
      //... I shorted it 
     } 

}

Tôi đã thử một cách rất nhiều thậm chí đưa mẫu thử nghiệm ngay vào lớp, nhưng nó không hoạt động anyway. Xin vui lòng giúp đỡ!

+2

Bạn không nên quá tải toán tử 'bằng' của' WordStatResult'? –

Trả lời

5

Tôi có thể thấy rằng hai tham chiếu tham chiếu đến các đối tượng có thuộc tính bằng nhau, nhưng đó không phải là những gì đang được thử nghiệm tại đây. Kiểm tra xem họ có tham chiếu đến cùng một đối tượng hoặc chúng bằng nhau không. Lớp StatResult của bạn không ghi đè Equals/GetHashCode, do đó, hai đối tượng có cùng giá trị sẽ được xem là "khác" để thử nghiệm.

Bạn nên ghi đè EqualsGetHashCode để hai đối tượng được cân nhắc một cách hợp lý. Tôi cũng muốn đề nghị làm kiểu bất biến, cũng như sau ước NET đặt tên bình thường đối với các thuộc tính:

public sealed class StatResult : IEquatable<StatResult> 
{ 
    public string Word { get; private set; } 
    public UInt64 Views { get; private set; } 

    public StatResult(string word, ulong views) 
    { 
     this.word = word; 
     this.views = views; 
    } 

    public override string ToString() 
    { 
     return String.Format("{0};{1}", word, views);     
    } 

    public override int GetHashCode() 
    { 
     int hash = 23; 
     hash = hash * 31 + Word == null ? 0 : Word.GetHashCode(); 
     hash = hash * 31 + Views.GetHashCode(); 
     return hash; 
    } 

    public override bool Equals(object other) 
    { 
     return Equals(other as StatResult); 
    } 

    public bool Equals(StatResult other) 
    { 
     return other != null && 
       this.Word == other.Word && 
       this.Views == other.Views; 
    } 
} 

xây dựng của bạn sẽ chỉ cần thay đổi để:

new StatResult("test", 98318), 
new StatResult("test board", 7801), 

(và tương tự như vậy trong sản xuất của bạn mã).

+0

Không thể đồng ý thêm về bất biến. Đó là điều chúng ta thường làm theo mặc định, nhưng có xu hướng bỏ qua/quên. – Randolpho

+0

Brilliant! Cảm ơn Jon lần nữa. – kseen

7

Vấn đề là cách NUnit kiểm tra sự bình đẳng của hai trường hợp StatResult. Bởi vì bạn không thực hiện bất kỳ hình thức toán tử so sánh bình đẳng nào, kiểm tra bình đẳng mặc định là tham chiếu của cá thể. Bởi vì chúng là hai trường hợp khác nhau, nên các tham chiếu của chúng khác nhau.

Xem this article để biết thêm thông tin về cách thực hiện bình đẳng trong đối tượng của bạn.

1

Bạn cần ghi đè bằng() và GetHashCode(). Hiện tại, nó đang kiểm tra xem mục đầu tiên trong mỗi danh sách có phải là một tham chiếu đến cùng một đối tượng hay không.

+0

Nhưng điều đó làm thay đổi nghiêm trọng lớp học và không phải là tốt hơn. –

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