2012-03-13 14 views
6

estoy ejecutando una prueba, pero si falla no sé qué:NUnit. Los valores difieren en el índice [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> 

Como se puede ver los valores son idénticos. Aquí hay un código:

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 
     } 

}

Probé muchas maneras, incluso poniendo la muestra de ensayo a la derecha en la clase, pero no funciona de todos modos. Por favor ayuda!

+2

¿No debería sobrecargar el operador 'igual' de' WordStatResult'? –

Respuesta

5

Veo que las dos referencias se refieren a objetos con propiedades iguales, pero eso no es lo que se prueba aquí. Está comprobando que o bien son referencias al mismo objeto o que son iguales. Su clase StatResult no anula Equals/GetHashCode, por lo que dos objetos con los mismos valores se considerarán como "diferentes" para la prueba.

Debe anular Equals y GetHashCode para que dos objetos se consideren iguales. También me sugieren hacer el tipo inmutable, así como después de las convenciones normales .NET de nomenclatura para las propiedades:

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

Su construcción se acaba de cambiar a:

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

(e igualmente en su producción código).

+0

No puedo estar más de acuerdo sobre la inmutabilidad. Es algo que generalmente deberíamos hacer de forma predeterminada, pero tendemos a ignorar/olvidar. – Randolpho

+0

Brillante! Gracias de nuevo Jon. – kseen

7

El problema es la forma en que NUnit está probando la igualdad de las dos instancias de StatResult. Como no está implementando ningún tipo de operador de comparación de igualdad, la comprobación de igualdad se establece de forma predeterminada en la referencia de la instancia. Debido a que son dos instancias diferentes, sus referencias son diferentes.

Consulte this article para obtener más información sobre cómo implementar la igualdad en sus objetos.

1

Debe reemplazar Igual() y GetHashCode(). Por el momento, está comprobando si el primer elemento de cada lista es una referencia al mismo objeto.

+0

Pero eso cambia severamente la clase, y no para mejor. –

Cuestiones relacionadas