2011-01-10 23 views
7

C#を使用してMsTestでクラス属性とメソッド属性の存在をテストする方法は?C#を使用してMsTestでテスト属性をユニット化する方法は?

+1

これはやり過ぎのように思えます。あなたはソースコードを検査することができます。 – jason

+3

実際、この種のものはリファクタリングの失敗を捕まえるのにはとても良いものです。属性に依存しているコードが十分にテストされていることを確認してください(まともなエラーメッセージを出す)も重要です。 –

+0

であり、TDDが必要です –

答えて

8

C# Extension method for checking attributes

public static bool HasAttribute<TAttribute>(this MemberInfo member) 
    where TAttribute : Attribute 
{ 
    var attributes = 
     member.GetCustomAttributes(typeof(TAttribute), true); 

    return attributes.Length > 0; 
} 
+0

にスポットがあり、上記の私の答えに補完することができます。私はちょうどこれを行うかもしれない。はるかにエレガント。 – dove

+0

あなたの考えを私の答えに入れればいいですか? – dove

+0

@ dove:そうだね。 –

4

反射を使用します。たとえば、ここではnunit + c#で、MsTestに簡単に適応します。

[Test] 
public void AllOurPocosNeedToBeSerializable() 
{ 
    Assembly assembly = Assembly.GetAssembly(typeof (PutInPocoElementHere)); 
    int failingTypes = 0; 
    foreach (var type in assembly.GetTypes()) 
    { 
    if(type.IsSubclassOf(typeof(Entity))) 
    { 
     if (!(type.HasAttribute<SerializableAttribute>())) failingTypes++; 
     Console.WriteLine(type.Name); 
     //whole test would be more concise with an assert within loop but my way 
     //you get all failing types printed with one run of the test. 
    } 
    } 
    Assert.That(failingTypes, Is.EqualTo(0), string.Format("Look at console output 
    for other types that need to be serializable. {0} in total ", failingTypes)); 
} 

//refer to Robert's answer below for improved attribute check, HasAttribute 
+0

少しの作業で、 'IsTypeSerializable'を任意の属性を扱える汎用メソッドにすることができます。 –

+0

@Robert、絶対に、System.Typeの拡張機能として読み進めるほうがいいかもしれません。 – dove

+0

@Robertにはちょっとおもちゃがありましたが、それは非常に難しいですが、上記。私の答えは、テストを念頭に置いて非常に修正されています。失敗したタイプがコンソールに書き込まれています。拡張メソッドは、次のようなシグネチャを持っているかもしれません:public static bool IsTypeSerializeable(System.Type type、System.Type checkType)// 2番目のパラメータとして属性を持たせたいかもしれませんが、それが呼び出された場合にのみ行います。大丈夫、私はそれを入れます;) – dove

1

自分自身にこれらの線に沿って(リフレクションを使用して)2つのヘルパー関数を書く:

public static bool HasAttribute(TypeInfo info, Type attributeType) 
public static bool HasAttribute(TypeInfo info, string methodName, Type attributeType) 

次に、あなたがこのようなテストを書くことができます:あなたがする必要はありません

Assert.IsTrue(HasAttribute(myType, expectedAttribute)); 

この道をif/else/foreachなどのロジックをテストメソッドで使用します。したがって、それらははるかに明確かつ読みやすくなります。

HTH
トーマス

+0

あなたはポイントを持っていますが、私のテスト(と私がここに入れなかった他のもの)は、ロバートが与えているように、失敗したエンティティごとにテストの複数の再実行を保存すると、もっとエレガントな方法があります。 – dove

関連する問題