2010-07-19 5 views
2

다음은 FluentNHibernate-1.1.0.685 (NHibernate-2.1.2.4000)에 대한 저장소의 간단한 테스트입니다. 세션과 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()를 호출하지 않고 실패 할 것으로 예상하지만 아직 그렇지 않습니다. 누군가가이 행동에 대해 밝힐 수 있습니까?

(참고 :이은 BTW PragProg 책 "테스트 드라이브 ASP.Net MVC"좋은 책의 10 장에서 발견되는 저장소 시험의 변형..)

답변

7

당신의 방법을 참조 어떤지를 확인하고 있습니다 포함되어 있기 때문에 반면 ID 또는 직원의 이름을 사용하여 평등을 확인하고 싶을 수도 있습니다.

Calling Clear()는 NHibernate의 세션에서 changedEmployee에 대한 참조를 제거합니다 (NHibernate는이 참조를 더 이상 사용하지 않습니다). 즉, 직원을 다시로드하면 변경된 직원의 새 인스턴스가 만들어집니다. 이 참조는 원래의 changedEmployee 객체와 참조 평등 검사를 통과하지 않습니다 (모든 속성이 동일해야 함).

Clear()가 없으면 NHibernate는 changedEmployee 객체에 대한 참조를 유지 관리하며이 참조는 GetAll 메소드에 의해 반환됩니다.

+0

고맙습니다. 그건 완벽하게 이해가됩니다. – nerraga

관련 문제