2008-12-02 4 views
2

NUnit 테스트 픽스처의 기본 클래스를 생성하면 SetUp 단계에서 TransactionScope를 연 다음 트랜잭션을 분리하는 동안 롤백하는 것이 좋을 것이라고 생각했습니다. 이 같은 뭔가 :안전한가요? # NUnit 기본 클래스가 TransactionScope를 열고 롤백합니다.

public abstract class TestFixtureBase 
{ 
    private TransactionScope _transaction; 

    [TestFixtureSetUp] 
    public void TestFixtureSetup() 
    { 
     _transaction = new TransactionScope(); 
    } 

    [TestFixtureTearDown] 
    public void TestFixtureTearDown() 
    { 
     if (_transaction != null) 
     { 
      _transaction.Dispose(); 
     } 
    } 
} 

당신이 좋은 아이디어라고 생각합니까?

분명히 데이터베이스는 실제 데이터베이스가 아닌 테스트 데이터베이스 일 뿐이지 만 단위 테스트의 정크 데이터로 채워지는 경우 여전히 성가 시게됩니다.

많은 데이터 액세스가 필요한 단위 테스트를 실행할 때 다른 사용자는 어떻게합니까?

답변

1

내가 XtUnit 그것은 자동으로 단위 테스트의 끝에서 롤백 사용했습니다. 테스트에 [Rollback] 속성을 추가하기 만하면됩니다. NUnit 또는 MbUnit의 확장인데

4

여기에서주의하고 싶습니다. TransactionScope는 데이터베이스에 대한 둘 이상의 연결을 열면 트랜잭션을 분산 트랜잭션으로 승격합니다. 필자는 테스트를 시작하기 전에 테스트 테이블에 관심있는 테이블을 지우는 간단한 SQL을 작성하는 것이 더 쉽다는 것을 알게되었습니다.

편집 : 일반적으로 나는 다른 시스템을 포함하고 있기 때문에 통합 테스트를 데이터베이스에 접촉하는 테스트를 호출합니다. 일반적으로 코드를 단위 테스트 할 때 데이터베이스를 조롱합니다.

[TestSetup] 
public void Setup() 
{ 
    foreach (string table in new string[] { "table1", "table2" }) 
    { 
     ClearTable(table); 
    } 
} 

private void ClearTable(string table) 
{ 
    ...standard stuff to set up connection... 
    SqlCommand command = connection.CreateCommand()); 
    command.CommandText = "delete from " + table; 
    command.ExecuteNonQuery(); 
    ... stuff to clean up connection... 
} 
+1

+ 1 ... 실제로 DAL 구현을 테스트하지 않는 한 데이터 액세스를 조롱합니다. – Gishu

관련 문제