2010-06-29 2 views
3

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

[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: Object reference not set to an instance of an object. at StructureMap.Pipeline.HttpContextLifecycle.findHttpDictionary() in c:\dev\opensource\structuremap\Source\StructureMap\Pipeline\HttpContextLifecycle.cs: line 50 at StructureMap.Pipeline.HttpContextLifecycle.FindCache() in c:\dev\opensource\structuremap\Source\StructureMap\Pipeline\HttpContextLifecycle.cs: line 28 at StructureMap.Pipeline.HttpContextLifecycle.EjectAll() in c:\dev\opensource\structuremap\Source\StructureMap\Pipeline\HttpContextLifecycle.cs: line 23 at StructureMap.Pipeline.HttpLifecycleBase`2.EjectAll() in c:\dev\opensource\structuremap\Source\StructureMap\Pipeline\HttpLifecycleBase.cs: line 18 at StructureMap.InstanceFactory.EjectAllInstances() in c:\dev\opensource\structuremap\Source\StructureMap\InstanceFactory.cs: line 127 at StructureMap.PipelineGraph.EjectAllInstancesOf() in c:\dev\opensource\structuremap\Source\StructureMap\PipelineGraph.cs: line 193 at StructureMap.Container.EjectAllInstancesOf() in c:\dev\opensource\structuremap\Source\StructureMap\Container.cs: line 393 at StructureMap.ObjectFactory.EjectAllInstancesOf() in c:\dev\opensource\structuremap\Source\StructureMap\ObjectFactory.cs: line 277

ответ

0

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

+0

Это не так, на самом деле это два экземпляра, один из которых был авто-проводным, а другой - макет. Кажется, это проблема только с ISession и тем, как она подключена, потому что я могу изгнать все остальные типы. Я закончил тем, что выбрасывал все репозитории и заменял их чужими. См. Обновление – epitka

2

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

Во всяком случае, в вашей тестовой установке (Boostrapper), измените жизненный цикл ISession на Hybrid или что-то еще, кроме HttpContext.

Смежные вопросы