繁体   English   中英

使用nhibernate和内存中的sqlite db进行单元测试设置有什么问题?

[英]What is wrong with this set up for unit tests using nhibernate and an in-memory sqlite db?

我有一个使用带有sqlite DB的nhibernate用c#编写的应用程序。 对于单元测试,我使用xunit和内存中的sqlite db。

我知道内存数据库在会话关闭时被破坏,所以为了测试,我使用一个会话并在测试期间保持打开状态。 在我的大多数测试中,这都很好。

但是,在少数情况下,我需要测试使用ISessionIStatelessSession 经过一番研究,我找到了类似于这里描述的方法的东西 所以IStatelessSession是使用ISession的连接创建的,如下所示:

statelessSession = factory.OpenStatelessSession(existingSession.Connection);

问题是,只要持续更改数据库,这似乎就会引起某种冲突。 如果我使用session.SaveOrUpdate(new Entity() {...})那么这很好但是如果我然后执行statelessSession.Get<Entity>(1)那么它将失败并显示错误消息“collection is not not与任何会话相关联“。

通常,此错误表示会话已关闭,但在这种情况下,两个会话仍处于打开和活动状态。

如果我执行session.Get<Entity>(1)然后它按预期返回实体。 最初,我认为这可能是因为会话和无状态会话在某种程度上不同步所以我用statelessSession.Insert(new Entity() {...})替换了session.SaveOrUpdate..并重新进行测试。 奇怪的是,这没有任何区别。 常规会话仍然正常,statelessSession仍然被打破。

最后,我找到了解决这个问题的方法:

最后,我回到了原始查询(比上面的示例更复杂的查询返回多个结果)并在通过它进行调试时尝试了各种各样的事情,但没有一个能够解决问题。 然后我决定删除该查询的“where”部分,看它是否有所不同。 奇怪的是,确实如此。 它仍然失败,但这次我得到了一个不同的例外:'无法执行查询',这也有一个内部异常:'可能的非线程安全访问会话'。

整个测试在一个线程上运行,我通过在调试时查看线程视图来确认这一点。 所以我以为我会碰到另一堵砖墙。 然而,经过一些谷歌搜索,我发现这篇博文描述了同样的问题和解决方案:只需更新到最新版本的nhibernate!

我从3.1.0更新到3.3.1(感谢NUGet,这是轻而易举的)重新运行测试,它工作。 放回where子句并通过测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM