Ninject (または他の DI ライブラリ) は、コントローラーのコンストラクターに依存関係を提供するためだけに使用されます。たとえば、BusinessController
2 つのリポジトリが必要な場合、コントローラーには、これらの依存関係を想定するコンストラクターが必要です。
public BusinessController(IUserRepository userRepository,
IOrderRepository orderRepository)
{
_userRepository = userRepository;
_orderRepository = orderRepository;
}
コントローラーの単体テストを作成する場合は、これらのリポジトリのモック実装を提供する必要があります。または他のフレームワークを使用Moq
してモックを作成します。
var userRepositoryMock = new Mock<IUserRepository>();
var orderRepositoryMock = new Mock<IOrderRepository>();
// setup mocks here
var controller = new BusinessController(userRepositoryMock.Object,
orderRepositoryMock.Object);
コントローラーの統合テストを作成している場合は、実際のデータベースを使用するこれらのリポジトリの実際の実装を提供する必要があります。
var userRepository = new NHibernateUserRepository();
var orderRepository = new NHibernateOrderRepository();
// prepare some data in database here
var controller = new BusinessController(userRepository, orderRepository);
テストからコードの重複を取り除くために、各テスト (SetUp または TestInitialize メソッド) の前に実行されるメソッドにコントローラーのインスタンス化を移動できます。
更新: 統合テストに Ninject を使用することもできます。実際のアプリケーションと統合テストの両方で使用される Ninject モジュールを作成するだけです。
public class FooModule : NinjectModule
{
public override void Load()
{
Bind<IUserRepository>().To<NHibernateUserRepository>();
Bind<IOrderRepository>().To<NHibernateOrderRepository>();
Bind<BusinessController>().ToSelf();
}
}
次に、このモジュールを使用して、NinjectWebCommon.CreateKernel メソッドでカーネルを作成し、テストでカーネルを作成します。
var kernel = new StandardKernel(new FooModule());
var controller = kernel.Get<ValuesController>();