2012-03-13 11 views
6

Sto correndo un test, ma se fallisce non so perché:NUnit. I valori differisce a indice [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> 

Come potete vedere i valori sono identici. Ecco il codice:

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 
     } 

}

ho provato un sacco di modi anche mettendo campione a destra in classe, ma non funziona comunque. Per favore aiuto!

+2

Non dovresti sovraccaricare l'operatore 'equal' di' WordStatResult'? –

risposta

5

Vedo che i due riferimenti si riferiscono a oggetti con proprietà uguali, ma non è ciò che viene testato qui. Sta controllando che si tratti di riferimenti allo stesso oggetto o che siano uguali. La tua classe StatResult non ha la priorità su Equals/GetHashCode, quindi due oggetti con gli stessi valori saranno considerati "diversi" per il test.

È necessario eseguire l'override di Equals e GetHashCode in modo che due oggetti vengano considerati correttamente uguali. Vorrei anche suggerire facendo il tipo immutabile, così come segue normali convenzioni di denominazione .NET per le proprietà:

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

sua costruzione sarebbe solo cambiare:

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

(e allo stesso modo nella vostra produzione codice).

+0

Non posso essere più d'accordo sull'immutabilità. È qualcosa che dovremmo generalmente fare di default, ma tendiamo a ignorare/dimenticare. – Randolpho

+0

Brillante! Grazie ancora Jon. – kseen

7

Il problema è il modo in cui NUnit sta testando l'uguaglianza delle due istanze di StatResult. Poiché non si sta implementando alcuna forma di operatore per il confronto delle uguaglianze, il controllo di uguaglianza assume come valore predefinito il riferimento dell'istanza. Poiché sono due istanze diverse, i loro riferimenti sono diversi.

Vedere this article per ulteriori informazioni sull'implementazione dell'eguaglianza nei propri oggetti.

1

È necessario eseguire l'override di Equals() e GetHashCode(). Al momento sta controllando se il primo elemento in ciascuna lista è un riferimento allo stesso oggetto.

+0

Ma questo cambia seriamente la classe, e non per il meglio. –

Problemi correlati