Подобие - полировка и упаковка

Я использую Likeness Ploeh.SemanticComparison как способ эффективного выражения предполагаемых результатов процесса сопоставления (как описано в отличный курс расширенного модульного тестирования Марка Симанна на 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);
}

Однако я недоволен :-

  1. Я хочу применить имя к сходству (т. е. назвать мою настройку .Without( y => y.ProgrammaticIdentifier))
  2. Я потерял симметрию с Assert.Equal( expected,actual, comparer) (но мне определенно нужно сообщение об ошибке от ShouldEqual)

Есть ли более чистый способ выразить это в рамках выраженных ограничений?


person Ruben Bartelink    schedule 23.05.2013    source источник
comment
Привет, Рубен, с текущим API это единственный способ сделать это. Однако в (ближайшем) будущем можно будет использовать библиотеку автоматического сопоставления (например, AutoMapper), чтобы вы могли использовать выбранную вами библиотеку автоматического сопоставления для создания настроек, профилей, конфигураций и т. д.   -  person Nikos Baxevanis    schedule 23.05.2013
comment
@NikosBaxevanis Я просматривал эту ветку, и стало ясно, что там происходят хорошие вещи, но, если вы извините за каламбур, для меня это в значительной степени греческий с точки зрения действительно грокка: P И мне нравится синтаксис в Ploeh.SemanticComparison (т.е. , мне еще предстоит столкнуться с случаем, который я пока не могу согнуть, чтобы он подходил для моего Золотого молота :D)   -  person Ruben Bartelink    schedule 23.05.2013


Ответы (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 );
    }
}
person Ruben Bartelink    schedule 23.05.2013