2011-10-10 2 views
0

통합 테스트가 실행되는 데이터베이스에 데이터 모음이 있습니다. 데이터베이스에서 Hibernate 지속 객체 변경을 방지하기 위해 에서 상속받은 EventListener DefaultSaveOrUpdateEventListener이 구현되었습니다. 예상대로Nhibernate가 데이터베이스에 객체의 변경 사항을 유지하지 않도록하는 방법

public override void OnSaveOrUpdate(SaveOrUpdateEvent @event) 
{ 
    @event.Session.CancelQuery(); 
    Trace.TraceWarning("NhibernateSaveUpdateCanceler: Persistence will be ignored."); 
} 

불행하게도이 작동하지 않습니다

은 그런 방법이있다. 그래서 의도 된 동작은 변경 사항이 데이터베이스에 쓰여지는 순간을 잡아서 객체를 떠난 채로 어떻게 든 취소 할 수 있도록하는 것입니다. 객체를 그대로두면 수정할 수 있으므로 유효성을 검사 할 수 있습니다.

감사합니다.

편집

가 한쪽에서 모든 거래에 사용할 수 있습니다 및 변경에 지속되지 않습니다 것을하도록 요구 사항에 모순이 변화를 지속함으로써이되도록 시험 방법에서 여러 트랜잭션이 있기 때문에이 작업을 수행 할 수 없습니다 다른 데이터베이스에서 데이터베이스.

+0

왜 필요한가요? –

+0

의도는 수정을 위해 객체를 검사 할 수 있지만 변경 사항이 데이터베이스에 반영되지 않으므로 동일한 데이터 세트에 대해 여러 테스트를 실행할 수있는 통합 테스트를 만드는 것입니다. –

+0

...하지만 여러 트랜잭션으로 테스트를 실행하는 방법은 무엇입니까? 당신은 Fran의 답변에 대한 언급에서 그것을 언급했습니다. 이것은 작동하지 않습니다. 그리고 더 중요한 것은 동일한 트랜잭션 내에서 NH은 후속 쿼리가 작동하도록 변경 사항을 플러시해야한다는 것입니다. 당신이 플러싱을 억제한다면, 당신은 그것을 깨뜨릴 것입니다. –

답변

1

통합 테스트 픽스처베이스로 통합 테스트를 다시 작성하십시오. nhibernate를 초기화하고 세션 팩토리를 생성하는 픽스처 설정 세션 팩토리를 닫는 테스트 설치 세션을 생성하는 테스트 설정과 트랜잭션 트랜잭션을 롤백하고 세션을 닫는 테스트 티 아웃 . 이

[TestFixture] 
public abstract class TestFixtureBase 
{ 
    protected ISessionFactory SessionFactory { get; private set; } 
    protected ISession Session { get; private set; } 
    protected ITransaction Tx { get; private set; } 

    [TestFixtureSetUp] 
    public virtual void SetUp() 
    { 
     var nh = new NHInit(); 

     nh.Initialize(); 

     SessionFactory = nh.SessionFactory; 
    } 

    [TestFixtureTearDown] 
    public virtual void TearDown() 
    { 
     SessionFactory.Close(); 
    } 


    [SetUp] 
    public void Test_Set_Up() 
    { 
     Session = SessionFactory.OpenSession(); 
     Tx = Session.BeginTransaction(); 
    } 

    [TearDown] 
    public void Test_tear_down() 
    { 
     Tx.Rollback(); 
     Tx.Dispose(); 
     Session.Close(); 
    } 
} 

같은

그런 다음 테스트를 작성.

+0

테스트 된 코드 안에 여러 트랜잭션이 있기 때문에 불행히도이 작업을 수행 할 수 없습니다. 더 작은 기능의 덩어리를 테스트 할 때 좋은 생각입니다. –

2

session.Save 또는 session.Update을 호출하면 SaveOrUpdate 이벤트 수신기가 호출됩니다. 변경 내용이 플러시되면 각 엔터티에 대해 FlushEntity 이벤트가 호출됩니다. IFlushEntityEventListener을 구현하십시오.

관련 문제