如何测试DI的使用(NInject)

时间:2015-06-12 16:14:18

标签: .net testing dependency-injection 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给我的预期。我无法开始沿着这条路走下去,因为我不知道访问内核来设置任何测试。在应用程序中启动内核的代码是静态私有方法的集合,对我来说有点神秘,我不知道如何在测试环境中执行此操作。有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

我会创建自己的内核和#include "soapExchangeServiceBindingProxy.h" #include "ExchangeServiceBinding.nsmap" int main() { ExchangeServiceBindingProxy service; service.soap_endpoint = "https://outlook.office365.com/ews/exchange.asmx"; ns1__GetServerTimeZonesType request; __ns1__GetServerTimeZonesResponse response; const std::string s("Eastern Standard Time"); request.Ids = (ns2__NonEmptyArrayOfTimeZoneIdType *)&s; if(service.GetServerTimeZones(&request , response) == SOAP_OK){ std::cout << "Success Response: "<< response.ns1__GetServerTimeZonesResponse << std::endl; } else service.soap_stream_fault(std::cerr); service.destroy(); // delete data and release memory return 0; } 您想要测试的模块。

Load()

这假设您已经在[TestMethod] public void TestThatWriterCrConnectorContainsConnector() { var kernel = new StandardKernel(); kernel.Load(new ModuleA(), new ModuleB()); var obj = kernel.Get<Writer>(); // ... assert }

中定义了要测试的所有绑定