ユニットテストを行うときは、コンテナをまったく使用しないでください。テスト対象のクラスを作成するには、そのコンストラクタを呼び出して適切なモックオブジェクトを渡します。
過去に私をここで多く助けてくれた1つのパターンは、単純なテストクラス固有のファクトリメソッドの使用です。このメソッドは、テスト中のクラスの作成を集中化し、テスト中のクラスの依存関係が変更されたときに行う必要がある変更の量を最小限に抑えます。それはコンテナを使用し、コンテナのいくつかの依存関係を交換するためにはるかに一般的だ統合テストのために
private ClassUnderTest CreateValidClassUnderTest(params object[] dependencies)
{
return new ClassUnderTest(
dependencies.OfType<ILogger>().SingleOrDefault() ?? new FakeLogger(),
dependencies.OfType<IMailSender>().SingleOrDefault() ?? new FakeMailer(),
dependencies.OfType<IEventPublisher>().SingleOrDefault() ?? new FakePublisher());
}
:これは次のようなファクトリメソッドが見ることができる方法です。それでも、これらの統合テストでは、application_startで作成したコンテナは使用されませんが、各テストは個別に実行する必要があるため、それぞれの統合テストには独自の新しいコンテナインスタンスが存在する可能性が高くなります。また、application_startから単一のコンテナを使用したとしても、統合テストは別のプロジェクトから実行され、実行中のアプリケーションに干渉することはありません。
各統合テストでは独自のコンテナインスタンス(ある場合)を取得する必要がありますが、できるだけコンテナ構成コードを再利用したいと考えています。これは、呼び出されたときに新しいコンフィグレーションされたコンテナインスタンスを返すか、提供されたコンテナインスタンスをコンフィグレーションする(そして何も返さない)メソッドにこのコードを抽出することによって行うことができます。このメソッドは通常、不完全な設定を行い、呼び出し元(テストまたはグローバルasaxのいずれか)が欠落している構成を追加する必要があります。
このコードを抽出すると、同じ構成を部分的に共有する複数のエンドアプリケーションを持つことができます。統合テストでコンテナを検証できます。統合テストによって嘲笑される必要があるサービスを追加することができます。
シンプルインジェクターを使用すると、既存の登録を新しいものに置き換えることができます(例:模擬したもの)。これを有効にするには、次のようにします:
container.Options.AllowOverridingRegistrstions = true;
ただし、これに注意してください。このオプションは、誤って登録を無効にするという事実を隠すことができます。私の経験では、ほとんどの場合、不完全なコンテナを構築して、それらを上書きするのではなく、不足している登録を追加するほうがはるかに優れています。または、オーバーライドを決定した場合は、偶発的な構成ミスを防ぐために、できるだけ最後にこの機能を有効にしてください。
自動テストの設定についてお話ししていますか?その場合は、テストケースごとにコンテナを再構築してください(必要に応じてモックを使用してください)。これはMSTestの '[TestInitialize]'とNUnitの '[SetUp]'です。 –