2010-07-19 148 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

相關問題