2011-08-06 11 views
8

依存性注入はコードを単体テストするのに役立ちます。しかし、正しい依存関係が実行時に最後に注入されるかどうかをテストするにはどうすればよいですか?たとえば、私はサービスバリデータのリストを取り込むサービスクラスを持っています。バリデータのリストはDIコンテナによって注入されるので、正しいバリデータが注入されていることを確認するにはどうすればよいですか?一部の開発者が誤ってバリデータをリストから削除した場合ある種のデンシティインジェクションでテストを書いても、カプセル化を壊さずにすべての依存関係をアサートすることはできません。唯一の方法は、サービスの検証動作を主張する統合テストです。サービスの振舞いが複雑な場合、統合テストを書くのが難しくなります。何か案は ??あなたの質問言い換えするどのように依存性注入をテストするのですか?

+2

私は統合テストが正しい答えだと思いますが、テストするのが難しい場合があります。 – Kevin

+2

一部の依存性注入フレームワーク(ほとんどではないが)は、コンテナにすべての登録を検証させ、各登録を作成できるかどうかをテストさせることができます。可能であれば、アプリケーションの開始時にこの検証をトリガーします。これにより、すべての依存関係を作成することができない場合にアプリケーションが起動するのを防ぎ、アプリケーションを実行(またはデバッグ)するときにすぐにDI構成エラーを見つけることができます。 – Steven

+0

@Steven休止状態にはこのような検証ツールがありますか? – mauryat

答えて

6

を私は自分のアプリケーションと、それらすべての作業の個々のコンポーネントをテストしているが、どのように私は、全体の作品のようなアプリケーションを知っていますか?

グッドニュース

どのように良いあなたが尋ねるする立場にあることに比べて、中にある位置考えてみましょう:私は今、このすべてのコードを書いている

、どのように私があれば知っていますアプリケーションは動作しますか?

ユニットテストでバグを見つけて削除しました。依存性注入スタイルのコーディングは、依存関係を明確にし、グローバル変数への依存を除去しました。これらの技術自体は、バグが少なくなることを意味します。アプリケーション全体をまとめたときのバグも少なくなります。あなたの質問に答えるために移動するには今すぐ

ビガー

テストは、あなたが特定のバリデータは、お使いの依存性注入コンテナによって返されることを主張するために、自動化テストを書くことができます。それは機能(検証だ実行するためにオブジェクトを依頼(共同作業オブジェクトのグラフは、バリデータのリストを例えば横たわる後ろ)オブジェクトに対して

  • をDIコンテナを掲載し

    • - :いっそのこと、私は足すのテストを好みますこのデータ)結果アサート
    • (例えば検証エラーは)

    あなたはテストダブルでデータベース、現在のサーバー時間、Webサービスなどにアクセスする特定のオブジェクトを交換したい場合があります。依存関係注入を使用しているため、これは簡単です。

    クラスが特に面倒でない限り、私はこのレベルでテストすることをお勧めします。これは、リファクタリングでより多くのテストが生き残るためです。サイコマティックな複雑さが1のクラスは、より大きなテストの一部として実行された場合、スタンドアロンテストを必要としません。より高い循環系複雑性を有するクラスは、

    多くのテストが有効ですか?

    それでも、あなたは疑問に思うかもしれません、しかし、すべてのことが機能しますか?

    最終的にこの質問に答えるには、アプリケーションを最終形式でテストする必要があります。Webアプリケーションの場合、これは適切なデータベースと実際のファイアウォールなどを備えた適切なサーバーにデプロイすることを意味します。その後、Seleniumなどで手動でテストまたはテストすることができます。

    正しい依存関係を注入できないと、注入されたコンポーネントが行うことになっている機能に致命的なエラーが発生します。すべての組み合わせをテストする必要はありませんが、各コンポーネントに軽く触れます。