Сходство - полировка и упаковка
Я использую Ploeh.SemanticComparison
"s Likeness
как способ эффективно выразить предполагаемые результаты процесса картирования (как описано в отличном курсе расширенного модульного тестирования Марка Симанна по PluralSight).
Я проверяю, что некоторые данные правильно сопоставлены, и выглядит так:
[Theory, AutoData]
static void ShouldYieldIdentifierUpdatedEvent( Vendor sut, string name, string version, Guid id )
{
var result = sut.SyncProduct( name, version, id );
var expected = new { ProductId = id, Name = name, Version = version };
expected.AsSource().OfLikeness<NewMappingsEvent>()
.Without( y => y.ProgrammaticIdentifier)
.ShouldEqual(result);
}
Тем не менее, я не счастлив:-
- Я хочу применить имя к сходству (то есть назвать мой
.Without( y => y.ProgrammaticIdentifier)
настройка) - Я потерял симметрию с
Assert.Equal( expected,actual, comparer)
(но мне определенно нужно сообщение об ошибке отShouldEqual
)
Есть ли более чистый способ выразить это в рамках выраженных ограничений?
1 ответ
Если у вас есть вспомогательный класс Assertion AssertResemblance
(например, [4]) и static
Вспомогательный как [1] в области вы можете сказать это так:
var expected = new { ProductId = id, Name = name, Version = version };
AssertResemblance.Like( expected, result, WithoutProgrammaticIdentifier );
Или, если у вас есть метод расширения, например [2], вы можете сделать это следующим образом:
AssertResemblance.Like( expected,result,x=>x.WithoutProgrammaticIdentifier());
Или вы можете получить лучшее из обоих миров (без шума, как в первом фрагменте), но при этом назвать "Сходство" (имея фактическое значение в методе расширения), реализовав локальный статический помощник в терминах метода расширения ([2]) как в [3].
[1]
public static Likeness<T, NewMappingsEvent> WithoutProgrammaticIdentifier<T>( Likeness<T, NewMappingsEvent> that )
{
return that.Without( x => x.ProgrammaticIdentifier );
}
[2]
static class NewMappingsEventResemblances
{
public static Likeness<T, NewMappingsEvent> WithoutProgrammaticIdentifier<T>( this Likeness<T, NewMappingsEvent> that )
{
return that.Without( x => x.ProgrammaticIdentifier );
}
}
[3]
static Likeness<T, NewMappingsEvent> WithoutProgrammaticIdentifier<T>( Likeness<T, NewMappingsEvent> that )
{
return that.WithoutProgrammaticIdentifier();
}
[4]
static class AssertResemblance
{
public static void Like<T, T2>( T expected, T2 actual )
{
Like( expected, actual, x => x );
}
public static void Like<T, T2>( T expected, T2 actual, Func<Likeness<T, T2>, Likeness<T, T2>> configureLikeness )
{
var likeness = expected.AsSource().OfLikeness<T2>();
configureLikeness( likeness ).ShouldEqual( actual );
}
}