2

クローニングメソッドを持ついくつかの基本的なクラスがあります:

public class SimpleClass
{
    public int ValueA { get; set; }

    public string ValueB { get; set; }

    public ulong ValueC { get; set; }

    public SimpleClass TypedClone()
    {
        var item = new SimpleClass
        {
            ValueA = this.ValueA,
            ValueB = this.ValueB,
            ValueC = this.ValueC 
        };

        return item;
    }
}

ValueD を追加したかどうかを示す単体テストが必要ですが、それを Clone メソッドに追加するのを忘れています。私の最初の試みは、Moq とその VerifyGet メソッドを使用して、各プロパティがアクセスされていることを確認することでした。

    public void GenericCloneTest()
    {
        var mock = new Mock<SimpleClass>();
        var c = mock.Object.GenericClone();
        var properties = typeof(SimpleClass).GetProperties();

        foreach (var property in properties)
        {
            var expression = Expression.Property(
                Expression.Parameter(typeof(SimpleClass), "c"), 
                property);

            var type = Expression.GetFuncType(typeof (SimpleClass),  
                property.PropertyType);

            var actionExpression = Expression.Lambda(type, expression,
                Expression.Parameter(typeof(SimpleClass), "c"));

            mock.VerifyGet<object>
                ((Expression<Func<SimpleClass,object>>)actionExpression);
        }
    }

これは、VerifyGet メソッドが Property アクセサーの戻り値の型を知る必要があるため機能しません。実行時にそれを挿入する方法がわかりません (「オブジェクト」を使用しようとした私の不自由な試みがクラッシュし、やけど)。

Moq を使用するのが良いアイデアかどうかさえわかりません。それは私の最初のアイデアでした。

更新: クローニング メソッドをテストするための迅速かつ簡単な一般的な方法がないため、各クラスの型固有のテストを作成することにしました。これにより、プロパティがいつ追加されたかを知るという問題が残ります。これをクローンユニットテストに追加することにしました:

      var signature = typeof (Connection)
            .GetProperties()
            .Select(p => p.Name)
            .Aggregate(
                new StringBuilder(), 
                (builder, name) =>
                    builder.Append(name)).ToString();

      Assert.AreEqual(
           "DataSessionStateDataTechnologyBytesReceivedBytesSentDuration",
           signature);

プロパティを追加すると、テストは失敗します。署名の一致が失敗した場合、残りのテストを修正するのに十分な責任があるかどうかは、依然として私にかかっています。

4

2 に答える 2

3

すべてのフィールドを確実に取得する最も簡単な方法の 1 つは、MemberwiseClone() メソッドを使用することです。これにより、すべてのクラス フィールドが新しいインスタンスに自動的にコピーされます。

于 2009-04-18T01:35:04.063 に答える