如何测试 DI 的使用 (NInject)
How to test use of DI (NInject)
我有一个 ASP.NET MVC 应用程序,它有一个 NInject 容器用于依赖项注入。正如宣传的那样,IoC 使我可以很容易地单独测试组件,然后轻松地在应用程序中组合组件。
我想测试我对 DI 的使用。我不想测试 DI 组件是否正常运行。我相信 NInject 的人在这方面做得很好。我想测试我是否已根据我的应用程序的意图使用 DI 正确地组合组件。我不想测试NInject,我想测试我对NInject的使用。 (我也不想尝试将其归类为单元测试或集成测试。我只想能够在投入生产之前的某个时间证明为什么我有信心我对 NInject 有效。)
假设我有这样的东西:
private static void RegisterDatabaseConnections(IBindingRoot kernel)
{
string connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
kernel.Bind<IProvideDbConnections>()
.To<Connector>()
.WhenInjectedInto<ActivityStore>()
.WithConstructorArgument("connectionString", connectionString);
kernel.Bind<IProvideDbConnections>()
.To<Connector>()
.WhenInjectedInto<CrConnector>()
.WithConstructorArgument("connectionString", connectionString);
kernel.Bind<IProvideDbConnections>()
.To<CrConnector>()
...
}
某处我有:
public class Writer
{
public Writer(IProvideDBConnections connector)
{
Connector = connector;
}
private IProvideDBConnections Connector { get; set; }
....
}
我想写一个像
这样的MSTest
[TestMethod]
public void TestThatWriterCrConnectorContainsConnector()
{
...
}
这样我就可以验证我写的 RegisterDatabaseConnections
是否符合我的期望。我在开始这条路时遇到了麻烦,因为我不知道访问内核来设置任何测试。在应用程序中启动内核的代码是静态私有方法的集合,对我来说有点神秘,我看不出在测试上下文中如何做到这一点。有帮助吗?
我会创建自己的内核和 Load()
您要测试的模块。
[TestMethod]
public void TestThatWriterCrConnectorContainsConnector()
{
var kernel = new StandardKernel();
kernel.Load(new ModuleA(), new ModuleB());
var obj = kernel.Get<Writer>();
// ... assert
}
这是假设您已经定义了所有要在 NinjectModule
中测试的绑定
我有一个 ASP.NET MVC 应用程序,它有一个 NInject 容器用于依赖项注入。正如宣传的那样,IoC 使我可以很容易地单独测试组件,然后轻松地在应用程序中组合组件。
我想测试我对 DI 的使用。我不想测试 DI 组件是否正常运行。我相信 NInject 的人在这方面做得很好。我想测试我是否已根据我的应用程序的意图使用 DI 正确地组合组件。我不想测试NInject,我想测试我对NInject的使用。 (我也不想尝试将其归类为单元测试或集成测试。我只想能够在投入生产之前的某个时间证明为什么我有信心我对 NInject 有效。)
假设我有这样的东西:
private static void RegisterDatabaseConnections(IBindingRoot kernel)
{
string connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
kernel.Bind<IProvideDbConnections>()
.To<Connector>()
.WhenInjectedInto<ActivityStore>()
.WithConstructorArgument("connectionString", connectionString);
kernel.Bind<IProvideDbConnections>()
.To<Connector>()
.WhenInjectedInto<CrConnector>()
.WithConstructorArgument("connectionString", connectionString);
kernel.Bind<IProvideDbConnections>()
.To<CrConnector>()
...
}
某处我有:
public class Writer
{
public Writer(IProvideDBConnections connector)
{
Connector = connector;
}
private IProvideDBConnections Connector { get; set; }
....
}
我想写一个像
这样的MSTest [TestMethod]
public void TestThatWriterCrConnectorContainsConnector()
{
...
}
这样我就可以验证我写的 RegisterDatabaseConnections
是否符合我的期望。我在开始这条路时遇到了麻烦,因为我不知道访问内核来设置任何测试。在应用程序中启动内核的代码是静态私有方法的集合,对我来说有点神秘,我看不出在测试上下文中如何做到这一点。有帮助吗?
我会创建自己的内核和 Load()
您要测试的模块。
[TestMethod]
public void TestThatWriterCrConnectorContainsConnector()
{
var kernel = new StandardKernel();
kernel.Load(new ModuleA(), new ModuleB());
var obj = kernel.Get<Writer>();
// ... assert
}
这是假设您已经定义了所有要在 NinjectModule