2011-06-01 12 views
8

¿Cómo afirmo que la colección contiene solo un elemento con un valor de propiedad dado?¿Cómo afirmar que la colección contiene solo un elemento con un valor de propiedad dado?

Por ejemplo:

class Node 
{ 
    private readonly string myName; 
    public Node(string name) 
    { 
    myName = name; 
    } 
    public string Name { get; set; } 
} 

[Test] 
public void Test() 
{ 
    var array = new[]{ new Node("1"), new Node("2"), new Node("1")}; 
    Assert.That(array, Has.Some.Property("Name").EqualTo("1")); 
    Assert.That(array, Has.None.Property("Name").EqualTo("1")); 

    // and how to assert that node with Name="1" is single? 
    Assert.That(array, Has.???Single???.Property("Name").EqualTo("1")); 
} 

Respuesta

14

1: Puede utilizar Has.Exactly() restricción:

Assert.That(array, Has.Exactly(1).Property("Name").EqualTo("1")); 

Pero tenga en cuenta ya que la propiedad es llegar por la reflexión, obtendrá error de ejecución en la propiedad caso "Nombre" no existirá

2: (Recomendado) Sin embargo, sería mejor obtener la propiedad por un predicado en lugar de una cadena. En caso de que no existirá nombre de la propiedad, obtendrá un error de compilación:

Assert.That(array, Has.Exactly(1).Matches<Node>(x => x.Name == "1"));  

3: De forma alternativa, se puede confiar en Count método:

Assert.That(array.Count(x => x.Name == "1"), Is.EqualTo(1)); 
1

¿Por qué no usar un poco de LINQ?

Assert.IsTrue(array.Single().Property("Name").EqualTo("1")); // Single() will throw exception if more then one 

o

Assert.IsTrue(array.Count(x => x.Property("Name").EqualTo("1") == 1); // will not 
+0

¿Por qué no utilizar LINQ en lugar de NUnit afirma en absoluto ? Assert.IsTrue (array.Where (x => x.Property ("Nombre") == 1) .Any()); Assert.IsFalse (array.Where (x => x.Property ("Nombre") == 1) .Any()); ;) –

Cuestiones relacionadas