2009-03-21 5 views
0

각 테스트를 트랜잭션으로 래핑하는 통합 테스트 클래스를 설정하려고합니다. 이렇게하면 각 테스트 전에 DB를 다시 설정하는 대신 트랜잭션을 롤백 할 수 있습니다.Rhino Commons UnitOfWork를 사용하여 통합 테스트를위한 트랜잭션 스코핑 중첩

또한 통합 테스트 자체에서 트랜잭션을 사용할 수 있기를 원합니다.

프로젝트를 위해 NHibernate와 Rhino Commons UnitOfWork를 사용하고 있습니다. 테스트를 위해 MSTest를 사용하고 있습니다.

[TestInitialize] 
public void TestInit() { 
    // create outer transaction scope 
    UnitOfWork.Start(); 
    UnitOfWork.Current.BeginTransaction(); 
} 

[TestCleanup] 
public void TestCleanup() { 
    // rollback outer transaction 
    UnitOfWork.Current.Dispose(); 
} 

[TestMethod] 
public void IntegrationTest() { 
    using (UnitOfWork.Start(UnitOfWorkNestingOptions.CreateNewOrNestUnitOfWork)) { 
     UnitOfWork.Current.BeginTransaction(); 

     // integration test code 

     UnitOfWork.Current.TransactionalFlush(); 

     // possibly more transactions 
    } 
} 

이 내가 NHibernate에, 코뿔소, 풍경, 및 MSTEST를 처음 사용하는 :

나는 이런 식으로 뭔가를 할 수 있습니다. 중첩 된 Rhino Commons가있는 세션의 동작에 대해서는 명확하지 않습니다. UnitOfWork s. 여기에있는 것은 통합 테스트의 변경 사항을 롤백하지 않습니다.

나는 System.Transactions에서 TransactionScope를 사용했지만, 다음과 같은 오류를 얻을 때 UnitOfWork의 말 :

System.InvalidOperationException : 트랜잭션이 진행되는 동안 분리가 .. 호출 할 수 없습니다

그래서 내 질문은 다음과 같습니다.
Rhino Commons의 UnitOfWork에서이 동작을 얻을 수있는 방법이 있습니까? 그렇지 않다면, 각 테스트 전에 데이터베이스를 재설정해야합니까, 아니면 UnitOfWork와 잘 작동하는 트랜잭션을 중첩 할 수있는 다른 방법이 있습니까?

감사합니다.

답변

0

나는 UnitOfWork.Start().BeginTransaction()RhinoTransaction을 반환한다고 생각합니다. 나는 위의 코드를 시도하지 않은,

using(IUnitOfWork uow = UnitOfWork.Start(UnitOfWorkNestingOptions.CreateNewOrNestUnitOfWork)) 
{ 
    RhinoTransaction tx = uow.BeginTransaction(); 
    . 
    . 
    . 
    . 
    tx.Rollback(); 
} 

그래도주의 할 작동하는지 알려주세요 : 그래서 그것은 더 명확이 같은 코드를 다시 작성하려고 할 수 있도록합니다.

관련 문제