相似性 – 抛光和包装

我正在使用Ploeh.SemanticComparisonLikeness来有效地表达映射过程的预期输出(如Mark Seemann在PluralSight上的优秀高级unit testing课程中所述 )。

我正在测试一些已正确映射的数据,如下所示:

 [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() .Without( y => y.ProgrammaticIdentifier) .ShouldEqual(result); } 

但是,我不高兴: –

  1. 我想将名称应用于相似性(即命名我的.Without( y => y.ProgrammaticIdentifier)自定义)
  2. 我已经失去了与Assert.Equal( expected,actual, comparer)的对称性Assert.Equal( expected,actual, comparer) (但我肯定需要来自ShouldEqual的错误消息)

是否有更清晰的方式在表达的约束内表达这一点?

如果你有一个名为AssertResemblance的Assertion助手类(如[4]),并且在范围内有一个像[1]这样的static助手,你可以这样说:

 var expected = new { ProductId = id, Name = name, Version = version }; AssertResemblance.Like( expected, result, WithoutProgrammaticIdentifier ); 

或者,如果你有像[2]这样的扩展方法,你可以这样做:

 AssertResemblance.Like( expected,result,x=>x.WithoutProgrammaticIdentifier()); 

或者你可以通过在扩展方法([2])方面实现本地静态助手来获得两个世界中最好的(没有第一个片段中的噪声),但命名相似性(通过在扩展方法中使用实际的impl)如[3]中所述。


[1]

 public static Likeness WithoutProgrammaticIdentifier( Likeness that ) { return that.Without( x => x.ProgrammaticIdentifier ); } 

[2]

 static class NewMappingsEventResemblances { public static Likeness WithoutProgrammaticIdentifier( this Likeness that ) { return that.Without( x => x.ProgrammaticIdentifier ); } } 

[3]

 static Likeness WithoutProgrammaticIdentifier( Likeness that ) { return that.WithoutProgrammaticIdentifier(); } 

[4]

 static class AssertResemblance { public static void Like( T expected, T2 actual ) { Like( expected, actual, x => x ); } public static void Like( T expected, T2 actual, Func, Likeness> configureLikeness ) { var likeness = expected.AsSource().OfLikeness(); configureLikeness( likeness ).ShouldEqual( actual ); } }