should c# unit-testing collections fluent-assertions

c# - should - ¿Cómo afirmar todos los artículos en una colección usando afirmaciones fluidas?



fluent assertions should throw (2)

Digamos que quiero probar un método que devuelve un grupo de elementos del siguiente tipo utilizando fluent-assertions para garantizar que todos los elementos tengan su IsActive establecida en true :

public class Item { public bool IsActive { get; set; } }

Para lograr eso, simplemente podría iterar sobre la colección y afirmar cada elemento por separado en un bucle foreach:

var items = CreateABunchOfActiveItems(); foreach (var item in items) { item.IsActive.Should().BeTrue("because I said so!"); }

Pero, ¿hay una manera más fluida de afirmar cada elemento de toda la colección a la vez?


Algo así como reemplazar su ciclo foreach con un método foreach debería ser el truco (al menos un poco).

var items = CreateABunchOfActiveItems(); items.ForEach(item => item.IsActive.Should().BeTrue("because I said so, too!"));

Encuentro esta sintaxis un poco más fluida que el ciclo foreach tradicional :)

Para Cada método no está definido si su método CreateABunchOfActiveItems devuelve un IEnumerable. Pero se puede implementar fácilmente como un método de extensión:

public static IEnumerable<T> ForEach<T>(this IEnumerable<T> enumeration, Action<T> action) { // I use ToList() to force a copy, otherwise your action // coud affect your original collection of items!. If you are confortable // with that, you can ommit it foreach (T item in enumeration.ToList()) { action(item); yield return item; } }


Quizás algo como esto:

var items = CreateABunchOfActiveItems(); items.Select(x => x.IsActive.Should().BeTrue("because I said so!")) .All(x => true);

Tenga en cuenta que la última línea ( .All(x => true) ) obliga al Select anterior a ejecutar para cada elemento.

O mejor:

var items = CreateABunchOfActiveItems(); items.Should().OnlyContain(x => x.IsActive, "because I said so!");

O cualquier otra solución que te pueda gustar:

var items = CreateABunchOfActiveItems(); items.All(x => x.IsActive).Should().BeTrue("because I said so!");