2016-06-22 5 views
2

私はSimpleInjectorを使用しており、かなり進歩した登録技術を使用しており、さらに進歩した登録のためにいくつかの拡張ポイントを使用することができます(下記の動機を参照)。これにより、コンテナが正しくブートストラップされていることを検証する単体テストを書く必要が生じました。たとえば、タイプA1 & A2は、C1とC2の両方によって実装されるサービスBに依存し、A1にC1を注入し、A2にC2を注入する必要があると仮定します。私は確かにA1がC1で注入され、A2がC2で注入されたことを確認するテストを書いています。 A1とA2から注入されたすべてのサービスの公開プロパティを公開してテストでその型を検証することはできましたが、私はむしろテストの目的でそれを行うのではありません。ビューをデバッグする目的で同じことをする診断APIに基づくオブジェクトグラフの解決方法をテストする簡単なAPIはありますか?シンプルインジェクター:登録をテストするには?

動機:進歩登録の背後にある動機は、注入コンテキストに基づいて注入サービスを置換/装飾することによって設計およびアーキテクチャの決定を実装することです。これはアプリケーションのコードを単純でテスト可能な状態に保ち、コンテナーの登録レベルに "if-then-else"の複雑さを加え、アプリケーションのコードを本当にSOLIDに保ちつつ、コンテナの登録だけにほとんど変更を加えずに済むようにしてくれます。このアイデアは、コマンド&のクエリーとデコレータの使用に関する3つの記事、コンパイル時または実行時のコンテキストに基づいて特定のデコレータを適用する機能について、.NETのJunkieの3つの記事からインスピレーションを得ています。

+0

[ここ](https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=91)と[ここ](HTTPS ://www.cuttingedge。it/blogs/steven/pivot/entry.php?id = 92) – qujck

答えて

2

オブジェクトグラフがどのように解決されるかをテストする簡単なAPIはありますか?ビューをデバッグする目的で同じように見える診断APIに基づくものでしょうか?

はいこれを行うにはいくつかの方法があります。考えられる2つのオプションは、InstanceProducer. Both allow visualizing object graphs. GetVelationships gives you a structured graph that you can iterate over, while VisualizeObjectGraph`のVisualizeObjectGraphGetRelationshipsメソッドで、オブジェクトグラフを文字列形式で返します。これはC#に似ています。

例:

var container = new Container(); 

// Do registrations 

// You need to verify to get the correct output of those methods 
container.Verify(); 

var r = container.GetRegistration(typeof(A1)); 

Console.WriteLine(r.VisualizeObjectGraph()); 

これはGetRelationships()を使用するときは、再帰的にグラフを反復処理することができますし、指定されたタイプは、登録(サブ)の依存性であるかどうかを確認

A1(
    FileLogger(
     Dependency1(), 
     Dependency2()), 
    C1(
     Dependency1(), 
     SomeService())); 

のようなものを出力。登録は書き込みテストのみであろうと、十分な表現力でなければなりません

  • 例:それは私はので、あなたは、登録チェックのこれらの種類を可能な限り制限するべきだと思いますけれども

    // Useful extension method 
    private static IEnumerable<InstanceProducer> GetDependencies(this InstanceProducer p) { 
        foreach (var r in p.GetRelationships()) { 
         yield return r.Dependency; 
         foreach (var d in r.Dependency.GetDependencies()) { 
          yield return d; 
         } 
        } 
    } 
    
    var container = new Container(); 
    
    // Do registrations 
    
    // You need to verify to get the correct output of those methods 
    container.Verify(); 
    
    var deps = container.GetRegistration(typeof(A1)).GetDependencies(); 
    
    Assert.IsTrue(deps.Any(p => p.Registration.ImplementationType == typeof(C1))); 
    

    はメモしていますあなたがすでにコンポジションルートで定義したものを繰り返します。

  • これらのシナリオの大部分は、機能レベルで既に広範な統合テストでカバーされているはずです。
  • シンプルなインジェクタの確認と診断機能は、一般的な誤設定を検出します。コマンドとクエリの記事を見つけることができます興味がある人のための
+1

ありがとうございました。私は、設計意図を表すものであることを検証したいと思っている論理を持つ重要でない登録に対してのみ、これらのテストを行うつもりです。たとえば、前に私が助けてくれたメトリクスの豊富さは、コンテナ機能を使用して特定のコンテキストで動作をデコレートし、実際に豊富化が行われることを確認するシナリオです。 SimpleInjectorは、デコレータと条件付き登録のサポートと、それらをソリッドと緩やかなカップリングデザインにどのように利用できるのか、素晴らしいです。 – Eldar

関連する問題