在内存 Web API 集成测试中模拟控制器依赖关系 Ninject

In memory Web API integration tests mocking out controller dependencies with Ninject

我有一个 Web API 2 应用程序我想在内存中添加一些托管服务器的测试。我在测试中有这个配置。

        public BaseServerTests()
        {
            var fake = Substitute.For<IFooService>();

            _server = TestServer.Create(app =>
            {
                var configuration = new HttpConfiguration();

                var container = new StandardKernel();
                container.Bind<IFooService>().ToConstant(fake);

                configuration.DependencyResolver = new NinjectDependencyResolver(container);

                WebApiConfig.Register(configuration);
                app.UseWebApi(configuration);
            });

            _client = _server.HttpClient;
        }

控制器只有一个这样的构造器

        public FooController(IFooService fooSrv)
        {
            _fooSrv = fooSrv;
        }

Web Api 中的 Ninject 配置如下所示。

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(NinjectWebCommon), "Start")]
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(NinjectWebCommon), "Stop")]

        public static void Start()
        {
            DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
            DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
            bootstrapper.Initialize(CreateKernel);
        }

我收到以下错误。

Ninject.ActivationException: '使用从 ModelValidatorProvider 到 NinjectDefaultModelValidatorProvider 的绑定激活 ModelValidatorProvider 时出错 在两个服务的构造函数之间检测到循环依赖性。

这是使用 Ninject 设置虚假依赖项的正确方法吗?

我完全错了。我现在开始工作了。我必须安装包 Ninject.Web.WebApi.OwinSelfHost.

        public BaseServerTests()
        {
            var fake = Substitute.For<ISomeService>();
            fake.SomeCall().Returns("this is totally fake");

            _server = TestServer.Create(app =>
            {
                var configuration = new HttpConfiguration();
                var container = new StandardKernel();

                container.Bind<ISomeService>().ToConstant(fake);
                WebApiConfig.Register(configuration);

                app.UseNinject(() => container);
                app.UseNinjectWebApi(configuration);
            });

            _client = _server.HttpClient;
        }