Проверка полного отображения [неупорядоченного] набора / набора элементов в модульном тесте
Я использую xUnit.net, AutoFixture и SemanticComparison и хочу проверить результаты сопоставления.
На уровне отдельных предметов я хорошо покрыта.
Дано
- Элементы имеют идентифицирующий ключ
- Я хочу сделать сравнение по элементам значения с обеих сторон
- Я не забочусь о заказе (и не хочу, чтобы мое Утверждение сломалось при повторном заказе)
Как мне проверить, что каждый входной элемент отображается на один и только один выходной элемент DAMP, но СУХОЙ, используя как можно больше OOTB-компонентов?
Светильники:
class Input
{
public string Name, Description;
}
class Output
{
public string Name, Description, IgnoreThisField;
}
Скелет Тест:
[Theory,AutoData]
void MappingWorks( Mapper sut, Input[] inputs)
{
var outputs = sut.Map( inputs);
// TODO assert that every input is mapped
// TODO assert that we have have no extra outputs
}
2 ответа
Учитывая [очень аккуратную] операцию FullOuterJoin и xUnit.net V2, вы можете выразить это как:
static void VerifyFeaturesetFullyMapped(
IEnumerable<Output> outputs,
IEnumerable<Input> inputs )
{
Assert.All(
inputs.FullOuterJoin( outputs,
f => f.Item1, r => r.Name,
( x, y, key ) => new {
InDescription = x.Item2,
OutDescription = y.Description } ),
inout =>
Assert.Equal( inout.InDescription, inout.OutDescription ) );
}
Учитывая некоторые AssertResemblance.Like
Коллекционеры [1], вы
- Расположите их в том же порядке (что наиболее четко сделано в теле теста, поскольку входные и выходные коллекции будут разных типов, и если
SemanticComparison
растет особенность, я не думаю, что это может быть полезно обобщено) - Позволять
Ploeh.SemanticComparison
"sLikeness
сделать сопоставление наName
- Позвольте xUnit.net V2 Assert.Collection сделать корреляцию (это еще не дает большое сообщение)
Конечный результат:
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();
}
}