gpt4 book ai didi

c# - 使用 nhibernate 和内存中的 sqlite 数据库进行单元测试的设置有什么问题?

转载 作者:行者123 更新时间:2023-11-30 18:36:13 25 4
gpt4 key购买 nike

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

我知道当 session 关闭时内存中的数据库被破坏,所以为了测试,我使用一个 session 并在测试期间保持打开状态。在我的大多数测试中,这工作正常。

但是,在少数情况下,我需要测试同时使用 ISession 的方法和 IStatelessSession .经过一些研究,我决定采用与描述的方法类似的方法 here .所以 IStatelessSession使用 ISession 创建的连接是这样的:

statelessSession = factory.OpenStatelessSession(existingSession.Connection);

问题是,一旦更改持久化到数据库,这似乎会引起某种冲突。如果我用 session.SaveOrUpdate(new Entity() {...}) 进行交易那很好但是如果我然后做statelessSession.Get<Entity>(1)然后它将失败并显示错误消息“集合未与任何 session 关联”。

通常,此错误表明 session 已关闭,但在这种情况下,两个 session 仍处于打开和事件状态。

如果我这样做 session.Get<Entity>(1)然后它按预期返回实体。最初,我认为这可能是因为 session 和无状态 session 以某种方式不同步,所以我更换了 session.SaveOrUpdate..statelessSession.Insert(new Entity() {...})并重新运行测试。奇怪的是,这没有任何区别。常规 session 仍然工作正常,statelessSession 仍然中断。

最佳答案

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

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

整个测试在单个线程上运行,我在调试时通过查看线程 View 确认了这一点。所以我想我又碰壁了。然而,经过一番谷歌搜索后,我发现了this blog post。描述了相同的问题和解决方案:只需更新到最新版本的 nhibernate!

我从 3.1.0 更新到 3.3.1(感谢 NUGet,这轻而易举)重新运行测试并且成功了。把 where 子句放回去,测试通过。

关于c# - 使用 nhibernate 和内存中的 sqlite 数据库进行单元测试的设置有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13991214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com