1

私はスタブの作成にMs unity containerandを使用しています。rhino mock

スタブを作成してユニティコンテナに登録しようとしています

IUnityContainer container = ContainerManager.GetDefaultContainer;

var loggerStub = MockRepository.GenerateStub<ILogger>();

container.RegisterType<ILogger, loggerStub>();

ただし、登録できるのはクラス種別のみです。

単体テストを実行するためにスタブ (ロガー スタブなど) を登録するにはどうすればよいですか?

4

1 に答える 1

1

RegisterInstance メソッドを使用して、特定のタイプを特定のインスタンスに解決するように Unity コンテナーを構成することもできます。

したがって、登録コードの最後の行を次のように変更する必要があります。

container.RegisterInstance(typeof(ILogger), loggerStub);

ただし、Unis テストで IoC コンテナーを使用する必要があるのは少し奇妙です。

テスト中のシステムのインスタンスを手動で作成できるはずです。

私の経験では、次の場合のテストで IoC を使用しました。

  • コンテナー構成自体をテストする必要がある場合 (例: 特定のタイプが正常に解決できることを確認する)
  • 非常に多くの依存関係があり、手動で指定するのが簡単ではなかった場合 (そのような場合、問題は実際には設計が悪いか、テストの分離が不十分でした)。
  • 統合テスト (単体テストではない) を実行する必要があるとき

アップデート

あなたのコメントを見て、単体テストでインジェクションを使用しない 2 つの理由をすぐに考えることができました。

  • 必要以上の仕事をしなければならないでしょう。アプリケーションでは、1 つのコンテナーをセットアップすると、すべてが解決されます。テストの場合、さまざまなスタブ/モックを使用して多くのコンテナー構成をセットアップする必要があります (各単体テストで何をテストしているかによって異なります)。テスト中のクラスに依存関係を手動で提供する方が簡単だと思います。
  • 一部のテストでは、すべての依存関係のスタブを設定するのを忘れて、単体テストが外部リソース (データベース、リモート サービスなど) にアクセスすることになる場合があります。
于 2012-10-21T16:23:57.343 に答える