StructureMap: как заменить объект во время выполнения - PullRequest
3 голосов
/ 29 июня 2010

Я пытаюсь внедрить смоделированный экземпляр ISession (NHibernate) в структуру карты. В настоящее время все это подключается в методе Bootstrap, но я хочу заменить тот, который вводится, поддельным. Я пытался EjectAllInstancesOf, но он выбрасывает исключение.

 [TestFixtureSetUp]
        public void TestFixtureSetup()
        {
            Bootstrapper.Bootstrap();
           //TODO: need to remove already wired up types that we are mocking.
            var mockSession = MockRepository.GenerateStub<ISession>();
            var mockLoggerFactory = MockRepository.GenerateStub<ILoggerFactory>();

            ObjectFactory.EjectAllInstancesOf<ISession>();
            ObjectFactory.EjectAllInstancesOf<ILoggerFactory>();

            ObjectFactory.Inject<ISession>(mockSession);
            ObjectFactory.Inject<ILoggerFactory>(mockLoggerFactory);
        }

Ошибка:

System.NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта. в StructureMap.Pipeline.HttpContextLifecycle.findHttpDictionary () в C: \ DEV \ с открытым исходным кодом \ StructureMap \ Source \ StructureMap \ Pipeline \ HttpContextLifecycle.cs: строка 50 в StructureMap.Pipeline.HttpContextLifecycle.FindCache () в C: \ DEV \ с открытым исходным кодом \ StructureMap \ Source \ StructureMap \ Pipeline \ HttpContextLifecycle.cs: строка 28 в StructureMap.Pipeline.HttpContextLifecycle.EjectAll () в C: \ DEV \ с открытым исходным кодом \ StructureMap \ Source \ StructureMap \ Pipeline \ HttpContextLifecycle.cs: строка 23 в StructureMap.Pipeline.HttpLifecycleBase`2.EjectAll () в C: \ DEV \ с открытым исходным кодом \ StructureMap \ Source \ StructureMap \ Pipeline \ HttpLifecycleBase.cs: строка 18 в StructureMap.InstanceFactory.EjectAllInstances () в C: \ DEV \ с открытым исходным кодом \ StructureMap \ Source \ StructureMap \ InstanceFactory.cs: строка 127 в StructureMap.PipelineGraph.EjectAllInstancesOf () в C: \ DEV \ с открытым исходным кодом \ StructureMap \ Source \ StructureMap \ PipelineGraph.cs: строка 193 в StructureMap.Container.EjectAllInstancesOf () в c: \ dev \ opensource \ structuremap \ Source \ StructureMap \ Container.cs: строка 393 в StructureMap.ObjectFactory.EjectAllInstancesOf () в C: \ DEV \ с открытым исходным кодом \ StructureMap \ Source \ StructureMap \ ObjectFactory.cs: линия 277

Ответы [ 2 ]

2 голосов
/ 11 мая 2012

Вы получаете это исключение, потому что ваш тип плагина (ISession) настроен в StructureMap как жизненный цикл HttpContext, а HttpContext отсутствует в модульном тесте.Это, вероятно, ошибка в StructureMap, она должна, вероятно, выдавать свое собственное исключение, объясняющее проблему, вместо того, чтобы использовать NullReferenceException.или что-то кроме HttpContext.

0 голосов
/ 30 июня 2010

Избавьтесь от звонков на EjectAllInstancesOf().Звонок Inject() должен делать то, что вы хотите.

...