7

Ninject を使用した UnitTesting プロジェクトで Moq を使用する際に問題が発生しています。

私のソリューションについての最初の数行。いくつかのプロジェクト (BussinesLogic、DAL、インフラストラクチャなど) が含まれています。私の目標は、BussinessLogic プロジェクトで使用しているロジックを UnitTest することです。ソリューションは基本的に Windows サービス用ですが、スタンドアロンで実行できるようにロジックを入れました。Ninject を使用しており、ProductionModule または TestingModule を使用する天気を指定します (Windows サービスは ProductionModule を使用し、コンソール アプリは TestingModule を使用します)。

アプリケーション内で必要なときはいつでもninjectカーネルを取得するためにファクトリーパターンを使用しています。

私の TestingModule は NinjectModule から継承し、そこで Load() メソッドをオーバーライドしてバインディングを行います。例えば:

Bind<IStorageManager>().To<StubStorageManager>();

StubStorageManager がありますが、空です。これには、IStorageManager からのメソッドの宣言のみが含まれています。

私がやりたいことは (素人の言葉で): unitTest を作成し、TestingModule をパラメーターとして指定して新しいカーネルを作成します。次に、モック オブジェクト (IStorageManager のモックとしましょう) storageManagerMock を作成したいと思います。IStorageManager の一部のメソッドは messageObject を返すため、おそらくそれもモックする必要があります。ビジネス ロジックがその messageObject に基づいて何かを実行しているためです。したがって、何らかの方法でそのメッセージ オブジェクトにプロパティを設定し、それに対していくつかの businessLogic メソッドを呼び出して、ロジックが正しく機能するかどうかを確認したいと考えています。

あまり複雑にしていないことを願っています。

私はモッキングと依存性注入にまったく慣れていませんが、喜んで学びます。

4

1 に答える 1

12

あなたが本当にテストで Ninject を使いたいと思っているとは思えません。ninject を使用するポイントは、すべてを分離できることです。また、可能であれば、すべてを依存関係コンテナー自体から分離したままにしておきたいと考えています。必要に応じて渡すか、必要なオブジェクトを作成するファクトリを渡し、コンテナをファクトリに渡します。

おそらく次のようなことをしたいと思うでしょう:

public void ATest(){
   //create a mock StorageManager
   var managerMock = new Mock<IStorageManager>();
   //create a mock MessageObject to be used by business logic
   var messageObjectMock = new Mock<MessageObject>();

   //have the storage manager return the mock message when required
   managerMock.Setup(x => x.GetMessageObject()).Returns(messageObjectMock.Object);
   //set up message expectations
   messageObjectMock.Setup(x => x.ThisValueExpected).Returns(10);
   messageObjectMock.Setup(x => x.ThisFunctionShouldBeCalled()).Verifiable("Function not called.");

   //thing to test
   BusinessLogicObject blo = new BusinessLogicObject(managerMock.Object);
   blo.DoTheThingImTesting();

   //make sure the business logic called the expected function, or do whatever check you need...
   messageObjectMock.Verify();
 }
于 2011-04-29T14:00:09.847 に答える