Имея несколько AssertResemblance.Like
помощников для коллекций[1], вы
- Поместите их в том же порядке (что наиболее четко выполняется в теле теста, поскольку входные и выходные коллекции будут разных типов, и если
SemanticComparison
не вырастет функция, я не думаю, что ее можно с пользой обобщить)
- Пусть
Likeness
из Ploeh.SemanticComparison
сопоставят Name
- Пусть Assert.Collection xUnit.net V2 выполнит корреляцию (она еще не дает большого сообщения)
Окончательный результат:
var results = from result in outputs orderby result.Name select result;
var expectations = from input in inputs orderby input.Name select input;
AssertResemblance.Like( expectations, results,
configure=>configure
.Without(x=>x.IgnoreThisField) );
[1]
static class AssertResemblance
{
public static void Like<T, T2>( IEnumerable<T> expected, IEnumerable<T2> actual )
{
Like<T, T2>( expected, actual, x=>x );
}
public static void Like<T, T2>( IEnumerable<T> expected, IEnumerable<T2> actual, Func<Likeness<T, T2>, Likeness<T, T2>> configureLikeness )
{
Assert2.Collection( actual, SelectShouldEqualAsAction( expected.Select( x => configureLikeness( x.AsSource().OfLikeness<T2>() ) ) ) );
}
public static void Like<T>( IEnumerable<T> expected, IEnumerable<T> actual, Func<IEnumerable<T>, IEnumerable<T>> unify )
{
Like<T>( expected, actual, unify, x=>x );
}
public static void Like<T>( IEnumerable<T> expected, IEnumerable<T> actual, Func<IEnumerable<T>,IEnumerable<T>> unify, Func<Likeness<T, T>, Likeness<T, T>> configureLikeness )
{
Assert2.Collection( unify( actual ), SelectShouldEqualAsAction( unify(expected).Select( x => configureLikeness( x.AsSource().OfLikeness<T>() ) ) ) );
}
static Action<TDestination>[] SelectShouldEqualAsAction<TSource, TDestination>( IEnumerable<Likeness<TSource, TDestination>> that )
{
return (from it in that select (Action<TDestination>)it.ShouldEqual).ToArray();
}
}
person
Ruben Bartelink
schedule
24.05.2013