相似-抛光和包装

本文关键字:包装 抛光 相似 | 更新日期: 2023-09-27 18:15:05

我使用Ploeh.SemanticComparisonLikeness作为有效表达映射过程预期输出的方法(如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);
}

然而,我不高兴:-

  1. 我想应用一个名称的相似性(即名称我的.Without( y => y.ProgrammaticIdentifier)自定义)
  2. 我已经失去了与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 );
    }
}