6

私はSimple Injector依存性注入フレームワークを使用しています。しかし、構成を作成して使用した後、構成を変更する方法を知りたい。シンプルインジェクタで異なる設定を使用

シナリオ:グローバルAsaxで設定を行い、公開とグローバルのContainerインスタンスがあるとしましょう。今私はいくつかのテストを行いたいので、モッククラスを使用して設定を変更したいと思っています。

もちろん、別の設定を作成し、それをデフォルトで作成されたグローバルContainerに割り当てることができるので、テストを実行するたびに別の設定が設定されます。しかし、それを実行すると私は開発の文脈ではあるが、通常の要求であっても、すべての人のためにContainerが変更されている。私はこの文脈でテストしていることを知っていますが、それは問題ではありませんが、これはこれを行う方法ではないという気持ちがあります...正しい設定で別の設定から別の設定に変更する方法がわかります。

+0

自動テストの設定についてお話ししていますか?その場合は、テストケースごとにコンテナを再構築してください(必要に応じてモックを使用してください)。これはMSTestの '[TestInitialize]'とNUnitの '[SetUp]'です。 –

答えて

6

ユニットテストを行うときは、コンテナをまったく使用しないでください。テスト対象のクラスを作成するには、そのコンストラクタを呼び出して適切なモックオブジェクトを渡します。

過去に私をここで多く助けてくれた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; 

ただし、これに注意してください。このオプションは、誤って登録を無効にするという事実を隠すことができます。私の経験では、ほとんどの場合、不完全なコンテナを構築して、それらを上書きするのではなく、不足している登録を追加するほうがはるかに優れています。または、オーバーライドを決定した場合は、偶発的な構成ミスを防ぐために、できるだけ最後にこの機能を有効にしてください。

+0

ありがとうございます。私が想像していたようだ。 –

関連する問題