6

2つのクラスプロパティには、次のアノテーションがあります。

    [Key]
    [Column]
    [Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }


    [MaxLength(25)]
    public string Name { get; set; }

Key、Column、Required属性のテストは単体テストではなく、基盤となるデータベースに依存する統合テストであることを理解していますが、MaxLength(25)属性のテストはどのように行いますか?

私が考えることができる代替案の1つは、プロパティにコードコントラクトを追加することです。

アップデート

提案されたように、私は次のヘルパーを書きました:

    public class AttributeHelper <T> where T : class
    {
        private Type GivenClass 
        { 
            get { return typeof (T); }
        }

        public bool HasAnnotation(Type annotation)
        {
            return GivenClass.GetCustomAttributes(annotation, true).Single() != null;
        }

        public bool MethodHasAttribute(Type attribute, string target)
        {
           return GivenClass.GetMethod(target).GetCustomAttributes(attribute, true).Count() == 1;
        }

        public bool PropertyHasAttribute(Type attribute, string target)
        {
            return GivenClass.GetProperty(target).GetCustomAttributes(attribute, true).Count() == 1;
        }

    }

次に、ヘルパーをテストしました。

    [TestMethod]
    public void ThisMethod_Has_TestMethod_Attribute()
    {
        // Arrange
        var helper = new AttributeHelper<AttributeHelperTests>();

        // Act
        var result = helper.MethodHasAttribute(typeof (TestMethodAttribute), "ThisMethod_Has_TestMethod_Attribute");

        // Assert
        Assert.IsTrue(result);
    }

リフレクションを使用するには、メソッドとプロパティをパブリックにする必要があるという事実を除けば、すべてが正常に機能します。プライベートプロパティ/メソッドに属性を追加しなければならなかったケースは考えられません。

次に、EFアノテーションをテストします。

        public void IdProperty_Has_KeyAttribute()
        {
            // Arrange
            var helper = new AttributeHelper<Player>();

            // Act
            var result = helper.PropertyHasAttribute(typeof (KeyAttribute), "Id");

            // Assert
            Assert.IsTrue(result);
        }
4

1 に答える 1

9

Key、Column、Required属性のテストは単体テストではなく、基盤となるデータベースに依存する統合テストであることを理解しています。

どうですか?Idプロパティがこれらすべての属性で適切にマークされているかどうかをテストできます。そして、それはユニットテストのカテゴリーに分類されます。

[Test]
public void Id_IsMarkedWithKeyAttribute()
{
    var propertyInfo = typeof(MyClass).GetProperty("Id");

    var attribute = propertyInfo.GetCustomAttributes(typeof(KeyAttribute), true)
        .Cast<KeyAttribute>()
        .FirstOrDefault();

    Assert.That(attribute, Is.Not.Null);
}

このようにして、プロパティが考えられる任意の属性でマークされていることを確認できます。確かに、これにはいくつかの反射作業が含まれますが、それが属性マーキングをテストする方法です。

于 2012-04-21T14:52:25.787 に答える