2

それで、私はインターネットで少し探し回って、誰かがすでにここで車輪を発明したかどうかを確かめようとしています。私がやりたいのは、現在のプロジェクトを解析し、特定のメソッドへのすべての参照を見つけ、その引数を見つけて、データベースでその引数をチェックする統合テストを作成することです。例えば:

public interface IContentProvider
{
     ContentItem GetContentFor(string descriptor);
}

public class ContentProvider : IContentProvider
{
    public virtual ContentItem GetContentFor(string descriptor)
    {
        // Fetches Content from Database for descriptor and returns in
    }
}

他のクラスは、IOCを使用してIContentProviderをコンストラクターに注入し、次のように記述できるようにします。

contentProvider.GetContentFor("SomeDescriptor");
contentProvider.GetContentFor("SomeOtherDescriptor");

基本的に、単体テストはこれらすべての参照を検索し、テキストのセット["SomeDescriptor"、 "SomeOtherDescriptor"]を検索します。次に、データベースをチェックして、これらの記述子に行が定義されていることを確認できます。さらに、記述子はハードコーディングされています。

すべての記述子に対して列挙値を作成することはできますが、列挙には何千もの可能なオプションがあり、それはちょっとしたハックのようです。

さて、SOに関するこのリンク:Reflection + C#ですべての参照を取得する方法は、基本的に、非常に高度なIL解析なしでは不可能であると述べています。明確にするために; Reflectorなどは必要ありません。実行できる自動テストであるため、チームの他の開発者がDBレコードを作成せずにこのコンテンツを呼び出すコードをチェックインすると、テストは失敗します。

これは可能ですか?もしそうなら、誰かが見るためのリソースや変更するためのサンプルコードを持っていますか?

編集:あるいは、すべての参照を見つけようとするこのVSを行う別の方法ですか?最終結果は、レコードが存在しないときにテストを失敗させたいということです。

4

1 に答える 1

1

これは非常に困難です。プログラムが記述子の値を計算する可能性があります。つまり、テストでは、上記のコードを実行しなくても、どの値が可能かを知ることができます。

列挙型を使用するか、タイプセーフな列挙型パターンを使用してコーディングすることにより、ここでのプログラミング方法を変更することをお勧めします。このようにして、aを使用するたびGetContentForに安全になります。引数は列挙型の一部であり、言語型チェッカーがチェックを実行します。

次に、テストでさまざまな列挙型フィールドを簡単に反復し、それらがすべてデータベースで宣言されていることを非常に簡単に確認できます。

新しいコンテンツキーを追加するには、列挙型を編集する必要がありますが、すべての通話が安全であることを確認するログに役立つため、これは少し不便です。

于 2011-03-29T17:22:03.857 に答える