2013-05-23 8 views
1

Я использую Ploeh.SemanticComparison's Likeness как способ эффективного выражения предполагаемых выходов процесса картографирования (как описано в Mark Seemann's excellent Advanced Unit Testing course on 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)

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

+2

Привет, Рубен, с текущим API, это единственный способ сделать это. В ближайшем будущем можно будет использовать библиотеку автоматического сопоставления (например, AutoMapper), чтобы вы могли использовать выбранную вами библиотеку автоматического сопоставления для создания настроек, профилей, конфигураций и т. Д. –

+0

@NikosBaxevanis Я просматривал эту ветку, и все ясно, что там есть хорошие вещи, но если вы помилуете каламбур, это в значительной степени греческий для меня с точки зрения действительно грохинга: P И мне нравится синтаксис в Ploeh .SemanticComparison' (т. Е. Я еще не столкнулся с делом, я не могу сдержать совпадения с моим «Золотым молотом»: D) –

ответ

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); 
    } 
}