首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用NHibernate对SQLite应用程序进行单元测试:它写入数据库,但不能读取

用NHibernate对SQLite应用程序进行单元测试:它写入数据库,但不能读取
EN

Stack Overflow用户
提问于 2010-07-29 16:36:04
回答 2查看 518关注 0票数 1

我有一个使用NHibernate的应用程序,该应用程序已经部署并正常工作,我正在重新考虑单元测试,以使用SQLite来提高性能,并将单元测试数据排除在“真实”数据库之外。

我有一个简单的测试,它创建一个Calendar实体,保存它,然后尝试读取它,并验证它是否是同一个对象。写入工作,但随后的选择读取它返回0条记录。Calendar有一个GUID作为主键,我理解这需要在SQLite连接字符串上增加一个参数。这是我的连接字符串:

代码语言:javascript
运行
复制
data source=:memory:;Version=3;New=true;Pooling=true;Max Pool Size=1;BinaryGuid=False

通过来自NHibernate的日志SQL语句,我看到要写入实体及其依赖项的插入,然后是后续的select语句。这一切看起来都很好,但没有任何选择。如果我使用的是文件数据库而不是内存中的数据库,则可以在Visual的服务器资源管理器中打开表,并在表中看到正确的数据。如果我编写一个查询来尝试选择记录,如下所示:

代码语言:javascript
运行
复制
SELECT     CalendarID, Name, Description
FROM         dbo_Calendars
WHERE     (CalendarID = 'a9cd9820-1694-4645-88d4-f682c5a6b9cc')

它也不能选择任何东西。我想这是GUID处理的问题,但我很困惑。

更新

下面是测试用例的样子:

代码语言:javascript
运行
复制
[Test]
    public void SaveAndLoadCalendar()
    {
        Guid calId;

        DAOFactory factory = (DAOFactory)DAOFactory;
        ISession s = factory.SessionManager.CurrentSession;
        using (var tx = s.BeginTransaction())
        {
            Calendar cal = new Calendar("Test Calendar", CalendarType.Test);
            cal.Active = true;
            cal.Browsable = true;
            s.Save(cal);

            tx.Commit();
            calId = cal.ID;
        }

        Logger.InfoFormat("Calendar ID is {0} ", calId);

        s.Clear();

        using (var tx2 = s.BeginTransaction())
        {
            Calendar cal = s.Get<Calendar>(calId);
            Assert.IsNotNull(cal, "Could not retrieve saved calendar");
            Assert.AreEqual("Test Calendar", cal.Name, "Saved calendar not equal to original calendar");
        }
    }
EN

回答 2

Stack Overflow用户

发布于 2010-07-29 16:48:18

我猜想事务处理可能是问题所在。

因此,插入记录的事务可能还没有提交,因此执行select的(不同的)事务还没有看到新的数据,因此select没有返回任何内容。

票数 0
EN

Stack Overflow用户

发布于 2010-07-29 20:56:53

我明白了,问题不在于NHibernate或SQLite,而是我。每个日历都有一个相关的主题。在我们的生产数据库中,这些都是手动输入的,并且预期会提前存在。现在我正在使用SQLite进行测试,我从一个空数据库开始,并且这个引用数据不是预先填充的。NHibernate的Select语句用于获取Calendar,它在Themes表上使用内部联接,而该表中没有任何内容,select将返回空。哦哦。

更新测试设置代码以保存默认主题后,测试将通过。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3364882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档