我有一个存储库类,它使用NHibernate会话将对象持久化到数据库。默认情况下,存储库不使用显式事务 - 这取决于要管理的调用者。我有以下单元测试来测试我的NHibernate管道:
[Test]
public void NHibernate_BaseRepositoryProvidesRequiredMethods()
{
using (var unitOfWork = UnitOfWork.Create())
{
// test the add method
TestRepo.Add(new TestObject() { Id = 1, Name = "Testerson" });
TestRepo.Add(new TestObject() { Id = 2, Name = "Testerson2" });
TestRepo.Add(new TestObject() { Id = 3, Name = "Testerson3" });
// test the getall method
var objects = TestRepo.GetAll();
Assert.AreEqual(3, objects.Length);
// test the remove method
TestRepo.Remove(objects[1]);
objects = TestRepo.GetAll();
Assert.AreEqual(2, objects.Length);
// test the get method
var obj = TestRepo.Get(objects[1].Id);
Assert.AreSame(objects[1], obj);
}
}
问题在于行
Assert.AreEqual(3, objects.Length);
测试失败,因为从GetAll
方法返回的对象列表为空。如果我在插入三个对象后立即手动刷新会话,那么测试的那部分就会通过。我在会话中使用默认的FlushMode,根据文档,它应该在运行查询之前刷新以检索所有对象,但显然不是。我缺少什么?
编辑:我正在使用Sqlite进行单元测试场景,如果这有任何区别的话。
答案 0 :(得分:3)
你说明了
根据文档,它应该在运行查询之前刷新以检索所有对象
但https://www.hibernate.org/hib_docs/v3/api/org/hibernate/FlushMode.html的文件,文件说明在自动冲洗模式(重点是我的):
会话有时会刷新 在查询执行之前 确保查询永远不会返回陈旧 州。这是默认的刷新模式。
所以,是的,您需要执行刷新以保存这些值,然后才能将它们显示在您的选择中。