2014-10-28 28 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 })); 

      } 
     } 

现在,考虑下面的单元测试代码。

[TestMethod] 
     [ExpectedException(typeof(System.Data.SqlClient.SqlException), "Username duplication is not allowded")] 
     public void Insert_EmployeeWithSameUsername_Fails() 
     { 

      ... 
      ... 
      ... 
      } 

我用SQLEXCEPTION,但其没有工作,但它仍然抛出一个错误......我应该在单元测试代码中使用哪种异常?

+0

如果您在调试器下运行它,那么抛出的异常的实际类型是什么? – 2014-10-28 11:29:10

+0

我在调试模式下运行,它会抛出sqlException – bnil 2014-10-28 11:31:01

+0

你确定它不是'DbUpdateException'吗? – RobH 2014-10-28 11:35:09

回答

0

使用EF 6或更高版本时,违反唯一索引约束将引发DBUpdateException。我不确定EF的eralier版本。唯一的问题是,每当数据库发生其他问题时都会引发DBUpdateException,因此在测试违反唯一索引时没有明确的方法。考虑以下代码:

 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) 
    ); 
} 
相关问题