2017-09-28 10 views
1

모든 테스트에서 간단한 트랜잭션을 설정하는 단위 테스트를위한 기본 클래스가 있습니다. 클래스에 대한 모든 검사가 완료된 후이 롤백한다 - TestInitialize의 TransactionAbortedException

public class TestBase 
{ 
    TransactionScope _trans; 

    [TestInitialize()] 
    public void Init() 
    { 
     _trans = new TransactionScope(); 
    } 

    [TestCleanup()] 
    public void Cleanup() 
    { 
     _trans.Dispose(); 
    } 
} 

내 상속 클래스 중 하나에서 나는 이러한 테스트의 실행하기 전에, 내가 한 번하고 싶은 일이 무리가 있습니다.

[TestClass] 
public class MyTests : TestBase 
{ 
    static TransactionScope _transClass; 
    [ClassInitialize()] 
    public static void ClassInit(TestContext context) 
    { 
     _transClass = new TransactionScope(); 
     //do some setup 
    } 

    [ClassCleanup()] 
    public static void ClassCleanup() 
    { 
     _transClass.Dispose(); 
    } 

    [TestMethod()] 
    public void TestMethod() 
    { 
     //do some testing 
    } 
} 

제 실제 수업에는 여러 가지 테스트 방법이 있습니다. 첫 번째 테스트 메서드는 정상적으로 통과하지만 두 번째 메서드는 TestInitialize에 새 TransactioScope를 설정하려고 할 때 TransactionAbortedException을 throw합니다. 누군가 제가 여기서 잘못 설정 한 것을 설명해 주시겠습니까?

답변

0

기본 클래스 TestBase이 각 테스트 후 연결로 무엇인가를 수행하고있는 것으로 의심됩니다.

using 문과의 거래를 사용하는 것이 가장 좋습니다. 문제가 해결됩니다.

또한 단일 트랜잭션에서 여러 개의 테스트를 수행하는 것은 좋은 생각이 아닙니다. 이는 테스트가 상호 의존적이라는 것을 의미합니다. 이로 인해 테스트가 통과하거나 그룹 내에서 실행되는지 여부에 따라 문제를 추적하기가 어려워집니다.

요약하면 트랜잭션에 대한 멤버 필드를 사용하지 말고 using 문과 함께 로컬 변수를 사용하는 것에 대해 조언합니다.