2009-11-30 6 views
1

Nhibernate 트랜잭션이 (호출 코드에서) 실패하여 강제로 실패한 동작이 제대로 작동하는지 확인할 수 있습니까?어떻게하면 Nhibernate 트랜잭션이 실패 할 수 있습니까?

소스 코드를 수정할 수 없어서 실패 만하면됩니다.

예 : 시작하고 다음 코드를 실행하도록 데이터베이스를 해제합니다 즉시 쿼리 실행 전에 라인에 정지를 디버깅하는 동안

public void DoSomething(/*Some parameters*/){ 
using (var tx = _session.BeginTransaction()) 
{ 
    try 
    { 
     //Do something 
     tx.Commit(); 
    } 
    catch (Exception) 
    { 
     if (tx != null) tx.Rollback(); 
      throw; 
    } 
} } 

답변

1

예외가 tx.Commit 내에서 발생() 다음에 잘못된 데이터 (예 : dbc에 비해 너무 긴 문자열)가있는 레코드를 삽입/업데이트 할 수 있습니다 olumn).

0

하나의 아이디어가 될 것입니다. 그러나 나는 이것을 테스트하는 더 나은 프로그래밍 방식이 있다고 가정한다.

3

예외를 발생시킵니다.

+0

예를 들어? –

+3

새로운 예외를 throw합니다(); – epitka

+0

심각한가요? 질문을 읽어주십시오 ... –

0

트랜잭션 내부 코드가 읽는 변수를 전역 변수로 설정하십시오 (전역 변수가 있지만 사람이 잘 사용하는 것으로 알고 있습니다).

2

예외를 던져 :

using(var sess = sf.OpenSession()) 
    using(var tx = sess.BeginTransaction()) 
     throw new Exception(); 

닫기 연결 :

using(var sess = sf.OpenSession()) 
    using(var tx = sess.BeginTransaction()) 
     sess.Connection.Close(); 

롤백 트랜잭션 : 당신이해야하는 경우

using(var sess = sf.OpenSession()) 
    using(var tx = sess.BeginTransaction()) 
     tx.Rollback(); 
0

코드의 예상되는 동작을 확인하기 위해 단위 테스트를 작성할 수 있습니다. 그것을 할 수

0

한 가지 방법은 다음과 같습니다

[Test] 
public void VerifyExceptionIsThrown() 
{ 
    Assert.Throws<NHibernate.HibernateException>(
     () => 
     { 
      using (var tx = _session.BeginTransaction()) 
      { 
       _session.Update(new Entity()); 
       tx.Commit(); 
      } 
     }); 
} 

exeption가 발생하는 일시적인 개체를 업데이트하려는 시도.

또는 NHibernateValidator를 사용하는 경우 설정 한 유효성 검사를 명시 적으로 실패 할 수 있습니다. 엔티티의 Name 속성은 10 자 이상이어야합니다. 엔티티의 Name 속성을 10 자보다 긴 문자열로 채우고 저장하려고하면 tx.Commit()가 예외를 throw합니다.

관련 문제