Ninject(或其他 DI 库)仅用于向控制器的构造函数提供依赖项。例如。如果你需要 BusinessController 需要两个存储库,那么控制器应该有构造函数来期望这些依赖关系:
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>();