1

Ploeh.SemanticComparisonマッピング プロセスのLikeness意図した出力を効果的に表現する方法としてを使用しています ( PluralSight に関する Mark Seemann の優れた Advanced 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<NewMappingsEvent>()
        .Without( y => y.ProgrammaticIdentifier)
        .ShouldEqual(result);
}

しかし、私は満足していません:-

  1. Resemblance に名前を付けたい (つまり、.Without( y => y.ProgrammaticIdentifier)カスタマイズに名前を付ける)
  2. との対称性が失われましたAssert.Equal( expected,actual, comparer)(ただし、 からのエラー メッセージは確実に必要ですShouldEqual) 。

表現された制約内でこれを表現するよりクリーンな方法はありますか?

4

1 に答える 1

1

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

または、拡張メソッドに関してローカル静的ヘルパーを実装することにより (拡張メソッドに実際の impl を含めることにより) 類似性に名前を付けながら (最初のスニペットのようにノイズがない) 両方の長所を活用することができます ([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 );
    }
}
于 2013-05-23T12:56:49.980 に答える