2010-07-19 113 views
2

以下是针对FluentNHibernate-1.1.0.685(NHibernate-2.1.2.4000)的存储库的简单测试。 Session和NH配置由测试夹具提供。为什么调用Session.Clear()会导致此测试失败?

 
[Test] public void ShouldEdit() { 
    var employee = CreateEmployee(); 
    session.Clear(); 

    var changedEmployee = _testRepository(employee.id); 
    changedEmployee.FirstName = "Ringo"; 
    _testRepository.SaveOrUpdate(changedEmployee); 

    session.Flush(); 
    session.Clear(); // Pulling this call will allow the test to pass. 

    var employees = (IList)_testRepository.GetAll(); 
    Assert.Contains(changedEmployee, employees); 
    Assert.IsFalse(employees.Contains(employee)); 
} 

Employee CreateEmployee() { 
    var e = {Id = 1, FirstName = "George", LastName = "Washington" }; 
    _testRepository.SaveOrUpdate(e); 
    session.Flush(); 
    return e; 
} 

如果我摆脱了第二次调用Clear(),该测试将通过。如果我离开电话但是然后测试将失败,出现以下情况:

 
Failed: 
Expected: Collection containing <Employee> 
But was: < <Employee> > 

不是很有帮助。除此之外,为什么我需要删除第二次调用Clear()?

Flush()将与db同步,如果我正确理解documentation,则Clear()将会驱逐会话缓存。这似乎正是我想要的行为,所以我可以确定我没有测试过时的数据。事实上,我希望测试失败没有调用Clear(),但事实并非如此。有人可以阐明这种行为吗?

(注:这是在PragProg书“试驾ASP.Net MVC”好书第10章发现BTW上的存储库测试的变化。)

回答

7

因为您的包含方法检查引用相等,而你可能想用Id或员工的名字来检查是否相等。

调用Clear()将从NHibernate的Session中删除对changedEmployee的引用(NHibernate将不再使用此引用)。这意味着当您重新加载员工时,会创建已更改员工的新实例。该引用不会传递与原始changedEmployee对象的引用相等性检查(尽管其所有属性应该相同)。

如果没有Clear(),NHibernate会维护对changedEmployee对象的引用,并且GetAll方法会返回相同的引用。

+0

谢谢。这很有道理。 – nerraga 2010-07-19 01:54:18

相关问题