我正在尝试将模拟的ISession(NHibernate)实例注入到结构图中。目前它都在Bootstrap方法中连接它,但是我想替换用模拟注入的方法。我尝试过EjectAllInstancesOf,但它会抛出execption。
[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()in C:\ dev的\开源\ structuremap \源\ StructureMap \管道\ HttpContextLifecycle.cs: StructureMap.Pipeline.HttpContextLifecycle.FindCache()中的第50行 C:\ dev的\开源\ structuremap \源\ StructureMap \管道\ HttpContextLifecycle.cs: 在StructureMap.Pipeline.HttpContextLifecycle.EjectAll()中的第28行 C:\ dev的\开源\ structuremap \源\ StructureMap \管道\ HttpContextLifecycle.cs: 在StructureMap.Pipeline.HttpLifecycleBase`2.EjectAll()中的第23行 C:\ dev的\开源\ structuremap \源\ StructureMap \管道\ HttpLifecycleBase.cs: 在StructureMap.InstanceFactory.EjectAllInstances()中的第18行 C:\ dev的\开源\ structuremap \来源\ StructureMap \ InstanceFactory.cs: 在StructureMap.PipelineGraph.EjectAllInstancesOf()中的第127行 C:\ dev的\开源\ structuremap \来源\ StructureMap \ PipelineGraph.cs: StructureMap.Container.EjectAllInstancesOf()中的第193行 c:\ dev \ opensource \ structuremap \ Source \ StructureMap \ Container.cs:line 393在StructureMap.ObjectFactory.EjectAllInstancesOf()中 C:\ dev的\开源\ structuremap \来源\ StructureMap \ ObjectFactory.cs: 第277行
答案 0 :(得分:2)
您收到此异常是因为您的插件类型(ISession)在StructureMap中设置为HttpContext生命周期,并且单元测试中没有HttpContext。这可能是StructureMap中的一个错误,它应该抛出它自己的异常来解释问题而不是命中NullReferenceException。
无论如何,在您的单元测试设置(Boostrapper)中,将ISession的生命周期更改为Hybrid或HttpContext之外的其他内容。
答案 1 :(得分:0)
取消对EjectAllInstancesOf()
的调用。致电Inject()
应该做你想做的事。