相似-抛光和包装
本文关键字:包装 抛光 相似 | 更新日期: 2023-09-27 18:15:05
我使用Ploeh.SemanticComparison
的Likeness
作为有效表达映射过程预期输出的方法(如Mark Seemann在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
的错误信息)
在已表达的约束中是否有更清晰的表达方式?
如果在作用域中有一个名为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])来命名相似性(通过在扩展方法中拥有实际的impl)。
[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 );
}
}