C#を使用してMsTestでクラス属性とメソッド属性の存在をテストする方法は?C#を使用してMsTestでテスト属性をユニット化する方法は?
答えて
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;
}
反射を使用します。たとえば、ここでは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
少しの作業で、 'IsTypeSerializable'を任意の属性を扱える汎用メソッドにすることができます。 –
@Robert、絶対に、System.Typeの拡張機能として読み進めるほうがいいかもしれません。 – dove
@Robertにはちょっとおもちゃがありましたが、それは非常に難しいですが、上記。私の答えは、テストを念頭に置いて非常に修正されています。失敗したタイプがコンソールに書き込まれています。拡張メソッドは、次のようなシグネチャを持っているかもしれません:public static bool IsTypeSerializeable(System.Type type、System.Type checkType)// 2番目のパラメータとして属性を持たせたいかもしれませんが、それが呼び出された場合にのみ行います。大丈夫、私はそれを入れます;) – dove
自分自身にこれらの線に沿って(リフレクションを使用して)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
トーマス
あなたはポイントを持っていますが、私のテスト(と私がここに入れなかった他のもの)は、ロバートが与えているように、失敗したエンティティごとにテストの複数の再実行を保存すると、もっとエレガントな方法があります。 – dove
- 1. MSTest属性の使用
- 2. 属性を使用してモデルオブジェクトをインスタンス化する方法は?
- 3. PHPユニットを使用したテスト方法
- 4. specflow + selenium webdriver + mstestを使用してマルチブラウザでテストする方法は?
- 5. MSTestをユニットが
- 6. FluentValidation.TestHelperを使用してWhen()条件を使用してテストの子バリデータをユニット化する方法
- 7. AngularJSユニット・テスト・ディレクティブの属性値
- 8. iOSでURLスキームをユニット化またはUIテストする方法
- 9. テスト用のWebソケットをユニット化する方法 - JavaScript
- 10. TestCase属性でnunit3-console.exeを使用したパラメータ化テスト
- 11. インスタンス属性を使用してクラス属性を定義する方法は?
- 12. ユニットがobj-cでシングルトンをテストする方法は?
- 13. オプションの属性を使用してクラスをインスタンス化する正しい方法
- 14. データ属性でvue2.0属性を使用する方法
- 15. DotNetOpenAuth属性ExchangeでFavoriteFlavor属性を使用する方法
- 16. jqueryを使用して属性を変更する方法は?
- 17. XUnitをビジュアルスタジオで使用してリモートプロセスでテストコードをユニット化する方法
- 18. TinyXML2で検索キーワードとして属性を使用する方法(C++)
- 19. android:layout属性を使用してカスタムプリファレンスのレイアウトをインスタンス化する方法
- 20. テスト/ユニットでRuntimeErrorをチェックする方法
- 21. MSTestを使用してプライベートフィールドをテストする
- 22. C#:テストに条件付き属性を使用する
- 23. Jquery "appendTo"を使用して属性を適用する方法
- 24. laravelでヘルパー関数を使用してテストビューをユニット化する方法
- 25. データドリブンユニットをドリルダウンする方法MSTestを使用したHudsonのテスト結果
- 26. ユニットRegistryManagerを使用するクラスをテストするC#Azure IoTHub
- 27. データモデル属性をhtml id属性として使用する方法
- 28. HostingEnvironment.MapPathを使用するテストコードをユニット化する方法
- 29. C#を使用して属性タグ付き値を追加する方法
- 30. c#を使用してActive Directory属性を更新する方法。
これはやり過ぎのように思えます。あなたはソースコードを検査することができます。 – jason
実際、この種のものはリファクタリングの失敗を捕まえるのにはとても良いものです。属性に依存しているコードが十分にテストされていることを確認してください(まともなエラーメッセージを出す)も重要です。 –
であり、TDDが必要です –