2014-10-28 84 views
8

我有以下幫助器方法,它將驗證消息從DbEntityValidationException中取出。我們需要這個,因爲默認情況下驗證的細節不會添加到Exception中。如何爲依賴於DbEntityEntry的對象創建單元測試

public static string LogMessageDbEntityValidationException(DbEntityValidationException ex) 
{ 
    StringBuilder error = new StringBuilder(); 

    error.AppendLine("Validation Error details for DbEntityValidationException throw: "); 

    foreach (var validationErrors in ex.EntityValidationErrors) 
    { 
     foreach (var validationError in validationErrors.ValidationErrors) 
     { 
     error.AppendLine(string.Format("Property: {0} , Error: {1}", 
          validationError.PropertyName, validationError.ErrorMessage)); 
     } 
    } 

    return error.ToString(); 
} 

我碰到試圖創建單元測試的問題,特別是因爲它需要DbEntityEntry,它不具有公共構造的一個實例,我不能創建一個DbEntityValidationResult。

這裏被打破單元測試,它無法在創建DbEntityEntry:

public void LogMessageDbEntityValidationExceptionTest() 
{ 
    string errorMessage = "Unit Test Error Message"; 
    string expected = "Not valid data."; 
    List<DbEntityValidationResult> entityValidationResults = new List<DbEntityValidationResult>(); 
    List<DbValidationError> errorList = new List<DbValidationError>(); 
    DbEntityValidationException ex; 

    errorList.Add(new DbValidationError("TestProperty", expected)); 

    entityValidationResults.Add(new DbEntityValidationResult(new System.Data.Entity.Infrastructure.DbEntityEntry(), errorList)); 

    ex = new DbEntityValidationException(errorMessage, entityValidationResults); 
    string actual = Common.LogMessageDbEntityValidationException(ex); 

    Assert.IsTrue(actual.Contains(expected)); 
} 

注意,DbEntityEntry沒有實現一個接口,所以我不能使用模擬/假的。

+0

你有沒有找到解決這個問題的方法? – user1535568 2016-11-17 15:42:17

回答

1

像Moq這樣的一些模擬框架可以做方法重定向,允許你在沒有接口的情況下模擬類。做類似於 http://www.codenutz.com/unit-testing-mocking-base-class-methods-with-moq/

這樣說,這不是一個很好的編程習慣,因爲你會使你的測試代碼永遠依賴於該框架,你失去了單元測試的一些設計好處。

你可以做的是編寫一個代理類來包裝你的不可測對象,並在其上添加一個接口,然後每次使用普通類時使用代理類。

+1

不幸的是,不可測對象被埋在EF代碼中。我將不得不圍繞太多的代碼編寫一個封裝。 – Josh 2014-10-28 22:14:04

+0

您也可以嘗試使用對象初始值設定項來調用對象的私有默認構造函數。 http://msdn.microsoft.com/en-us/library/bb397680.aspx 這就是說使用Moq你應該能夠使用框架來做到這一點。 – 2014-10-28 23:19:27