2011-02-23 9 views
11

Estoy usando NUnit 2.5.7. Quiero probar si una colección de objetos personalizados de una clase en particular contiene ciertos objetos, en función de una de las propiedades de la clase.Comprobando si una colección contiene objetos basados ​​en una propiedad particular

p. Ej. un ejemplo artificioso ...

public class Person 
{ 
    public string Name { get; set; } 

    public Person(string name) 
    { 
     Name = name; 
    } 
} 

// ... 

public List<Person> GetFavouritePeople() 
{ 
    List<Person> favouritePeople = new List<Person>(); 
    favouritePeople.Add(new Person("joe")); 
    favouritePeople.Add(new Person("fred")); 
    favouritePeople.Add(new Person("jenny")); 

    return favouritePeople; 
} 

// ... 

[Test] 
public GetFavouritePeople() 
{ 
    List<Person> people = GetFavouritePeople(); 

    // What I'd like to test, but not sure how to do it... 
    Assert.Contains(Name="joe", people); 
    Assert.Contains(Name="fred", people); 
    Assert.Contains(Name="jenny", people); 
} 

Aunque sería bastante simple en este ejemplo, no quiero crear objetos simulados para cada persona y utilizar los de la afirmación ... Sólo quiero una comprobación basándose en una propiedad particular (. nombre en este ejemplo)

Respuesta

19

se podría utilizar LINQ:

Assert.That(people.Any(p => p.Name == "joe")); 

o, si se quiere ser explícito acerca de que hay exactamente una persona con cada nombre:

Assert.That(people.Count(p => p.Name == "joe"), Is.EqualTo(1)); 

Si desea un mensaje de error mejor que "La aserción falló, se esperaba cierto, era falsa", podría crear su propio método assert.

Para varias afirmaciones relacionadas con colecciones, CollectionAssert es muy útil, por ejemplo, le permite comprobar si dos colecciones contienen los mismos elementos, independientemente de su orden. Así que otra posibilidad es:

CollectionAssert.AreEquivalent(new[] {"joe", "fred", "jenny"}, people.Select(p => p.Name).ToList()); 

Tenga en cuenta que CollectionAssert.AreEquivalent() es un poco exigente en cuanto a los tipos que acepta (a pesar de que la firma lleva IEnumerable). Normalmente lo envuelvo en otro método que llama al ToList() en ambos parámetros antes de invocar CollectionAssert.AreEquivalent().

0

Puede utilizar LINQ de Intersect() para determinar si todos los elementos previstos son los siguientes en la lista de sus pruebas en contra, incluso si la lista contiene otros elementos que no se está probando para:

[Test] 
public void TestFavouritePeople() 
{ 
    var people = GetFavouritePeople(); 
    var names = people.Select(p => p.Name); 

    var expectedNames = new[] {"joe", "fred", "jenny"}; 
    var actualNames = names.Intersect(expectedNames); 

    CollectionAssert.AreEquivalent(expectedNames, actualNames); 
} 

Para NUnit 3.0 y superior, puede usar Is.SupersetOf():

[Test] 
public void TestFavouritePeople() 
{ 
    var people = GetFavouritePeople(); 
    var names = people.Select(p => p.Name); 

    var expectedNames = new[] {"joe", "fred", "jienny"}; 
    var actualNames = names; 

    Assert.That(actualNames, Is.SupersetOf(expectedNames)); 
} 
Cuestiones relacionadas