2014-10-28 5 views
0

저는 단위 테스트를하고 있습니다. ExpectedExceptionAttribute를 사용하려고합니다.유닛 테스팅 중에 ExpectedExceptionAttribute에서 어떤 유형의 예외를 사용해야합니까?

사용자 이름이 고유해야하므로 색인을 사용하는 사용자 이름 속성이 포함 된 직원 클래스가 있습니다.

코드는 다음과 같습니다.

public class EmployeeConfigration : EntityTypeConfiguration<Employee> 
     { 
      public EmployeeConfigration() 
      { 
       this.Property(x => x.FirstName).IsRequired().HasMaxLength(50); 
       this.Property(t => t.UserName).HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute("IX_UserName", 1) { IsUnique = true })); 

      } 
     } 

다음은 단위 테스트 코드입니다.

SqlException을 사용했지만 작동하지 않는 경우에도 여전히 오류가 발생합니다 ... 단위 테스트 코드에서 어떤 종류의 예외를 사용해야합니까?

+0

디버거에서 실행하면 예외의 실제 유형은 무엇입니까? –

+0

디버그 모드로 실행하면 sqlException이 throw됩니다. – bnil

+0

'DbUpdateException'이 아닌가요? – RobH

답변

0

EF 6 이상을 사용할 때 고유 인덱스 제약 조건을 위반하면 DBUpdateException이 발생합니다. EF의 버전이 이상하다고 확신하지 않습니다. 유일한 문제점은 데이터베이스에 다른. 제 점이 _ 생할 때마다 DBUpdateException이 _ 생하기 때.에 고유 색인 위반을 테스트하는 명확한 f}이 x습니다.

 try 
     { 
      //some code here that causes the error 
     } 
     catch (DbUpdateException ex) 
     { 
      var updateException = ex.InnerException as UpdateException; 

      if (updateException != null) 
      { 
       var sqlException = updateException.InnerException as SqlException; 
       // UIX or PK violation, so try to update/insert. 
       var uixViolationCode = 2601; 
       var pkViolationCode = 2627; 
       if (sqlException != null && sqlException.Errors.OfType<SqlError>().Any(se => se.Number == uixViolationCode || se.Number == pkViolationCode)) 
       { 
        // handle the required violation 
       } 
       else 
       { 
        // it's something else... 
        throw; 
       } 
      } 
      else 
      { 
       throw; 
      } 
     } 
1

MSDN에서 : 슬로우 된 예외가 예상되는 예외를 상속하는 경우

시험은 실패 코드를 생각해 보자.

실제로는 SqlException에서 파생 된 예외가 발생하는 것처럼 보입니다.

가능하면 속성 대신 xUnit/NUnit을 사용하십시오.

try 
{ 
    //code 
} 
catch (SqlException se) 
{ 

} 
catch (Exception e) 
{ 
    Assert.Fail(
     string.Format("Unexpected exception of type {0} caught: {1}", 
         e.GetType(), e.Message) 
    ); 
}