2009-12-28 9 views
1

Ayite가 SQLite로 NHib 유닛 테스트를위한 간단한 기본 테스트 픽스처를 만들 때 내가 생각한 것이 great article 인 것을 발견했다.NHibernate unit 테스트 케이스 101

여기 내 질문은 구체적인 테스트 픽스처의 테스트 케이스 코드입니다. 아래의 EX_1에서 Ayende는 그가 저지른 트랜잭션에 페치를 저장하고 둘 사이에 Session.Clear를 저장합니다. 이 과정은 물론 EX_2도 마찬가지입니다.

모든 것들이 더 작고 읽기 쉬운 EX_2를 선호합니다. EX_1의 추가 코드가 왜 혼란스러운 가치가있는 이유에 대한 의견이 있으십니까?

건배,
Berryl

==== EX_1 =====

[Fact] 
public void CanSaveAndLoadBlog_EX_1() 
{ 
    object id; 

    using (var tx = session.BeginTransaction()) 
    { 
     id = session.Save(new Blog 
     { 
      AllowsComments = true, 
      CreatedAt = new DateTime(2000,1,1), 
      Subtitle = "Hello", 
      Title = "World", 
     }); 

     tx.Commit(); 
    } 

    session.Clear(); 


    using (var tx = session.BeginTransaction()) 
    { 
     var blog = session.Get<Blog>(id); 

     Assert.Equal(new DateTime(2000, 1, 1), blog.CreatedAt); 
     Assert.Equal("Hello", blog.Subtitle); 
     Assert.Equal("World", blog.Title); 
     Assert.True(blog.AllowsComments); 

     tx.Commit(); 
    } 
} 

==== EX_2 =====

[Fact] 
    public void CanSaveAndLoadBlog_EX_2() 
    { 
     var id = session.Save(new Blog 
           { 
            AllowsComments = true, 
            CreatedAt = new DateTime(2000, 1, 1), 
            Subtitle = "Hello", 
            Title = "World", 
           }); 

     var fromDb = session.Get<Blog>(id); 

     Assert.Equal(new DateTime(2000, 1, 1), fromDb.CreatedAt); 
     Assert.Equal("Hello", fromDb.Subtitle); 
     Assert.Equal("World", fromDb.Title); 
     Assert.True(fromDb.AllowsComments); 

    } 

답변

1

내가 함께 생각 NHibernate는 쿼리 만하는 경우에도 트랜잭션을 사용하는 것이 좋습니다. 이 기사를 확인하십시오 http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions.

또한 사용중인 기본 키 유형에 따라 EX_2 코드가 데이터베이스에 도달하지 않을 수도 있습니다. 당신이 autoincrement 인 identity 키를 사용한다면, NHibernate는 데이터베이스에 접근하여 프라이 머리 키를 얻습니다. 그러나 guid, guid.comb, 또는 hilo를 사용한다면 데이터베이스를 전혀 공격하지 않을 것입니다. 그래서 Get은 Hibernate가 커밋을 변경하고 세션을 지우지 않으면 메모리에 아무 것도 없다는 것을 알기 때문에 NHibernate가 메모리에 캐시 한 것을 잡아낼 것입니다.

+0

@Emmanuel - 나는 Hibernate와의 읽기 작업을 위해 항상 트랜잭션을 사용한다는 것을 몰랐다. 그것을 지적 주셔서 감사합니다. 문서 11.2 절에서도이를 확인할 수 있습니다. (http://docs.jboss.org/hibernate/core/3.3/reference/en/html/transactions.html) "읽기 전용 인 경우에도 항상 명확한 트랜잭션 경계를 사용하십시오. 작업. " – dcp

관련 문제