使用SQLite对NHibernate应用程序进行单元测试:它写入数据库但无法回读

时间:2010-07-29 16:36:04

标签: nhibernate sqlite nunit

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

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

data source=:memory:;Version=3;New=true;Pooling=true;Max Pool Size=1;BinaryGuid=False

通过来自NHibernate的已记录的SQL语句,我看到了用于编写实体及其依赖项的插入,然后是后续的select语句。一切看起来都不错,但没有选择。如果我使用文件数据库而不是内存数据库,我可以在Visual Studio的服务器资源管理器中打开表,我在表中看到了正确的数据。如果我写一个查询来尝试选择记录,就像这样:

SELECT     CalendarID, Name, Description
FROM         dbo_Calendars
WHERE     (CalendarID = 'a9cd9820-1694-4645-88d4-f682c5a6b9cc')

它也无法选择任何东西。我认为这是GUID处理的一个问题,但我很沮丧。

更新

这是测试用例的样子:

[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");
        }
    }

2 个答案:

答案 0 :(得分:0)

我猜想交易处理可能是问题所在。

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

答案 1 :(得分:0)

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

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