2012-07-17 224 views
2

我已經爲使用IValidatableObject的一些實體框架對象編寫了一些自定義驗證,並且我已經爲對象添加了一些DataAnnotations用於驗證。單元測試實體框架驗證

我想測試驗證是否滿足所需的驗證(確保自定義驗證正在工作,並且所做的任何更改都會保留這些數據註釋等)但我無法確定如何在驗證中運行驗證無需調用的SaveChanges(我不想做,因爲如果有一個問題,驗證不起作用,將寫入到數據源)單元測試

我想要做這樣的事情:

[TestMethod] 
public void InvalidStartDate_StartDateAfterEndDate() 
{ 
    var header = new Header() 
        { 
         StartDate = DateTime.Now.AddDays(15), 
         EndDate = DateTime.Now.AddDays(-15) 
        }; 
    var actual = header.IsValid(); 
    var expected = false; 
    Assert.AreEqual(expected, actual); 
} 

或類似

[TestMethod] 
public void InvalidStartDate_StartDateAfterEndDate() 
{ 
    var header = new Header() 
        { 
         StartDate = DateTime.Now.AddDays(15), 
         EndDate = DateTime.Now.AddDays(-15) 
        }; 
    var actual = header.GetValidationErrors().Count; 
    var expected = 0; 
    Assert.AreEqual(expected, actual); 
} 

但似乎無法找到一種方法來獲取驗證運行而不調用保存更改,有沒有辦法做到這一點?

+0

db.GetValidationErrors()應該工作..你可以發佈你的Header類的代碼? – Luxspes 2012-07-17 00:53:53

回答

4

您可以調用Validator來驗證對象。

[TestMethod] 
public void InvalidStartDate_StartDateAfterEndDate() 
{ 
    var header = new Header() 
        { 
         StartDate = DateTime.Now.AddDays(15), 
         EndDate = DateTime.Now.AddDays(-15) 
        }; 

    var context = new ValidationContext(header, null, null); 
    var results = new List<ValidationResult>(); 

    var actual = Validator.TryValidateObject(header, context, results); 
    var expected = false; 

    Assert.AreEqual(expected, actual); 
} 
+1

TryValidateObject上有第四個參數,它是一個負責遍歷所有屬性的布爾值,即使那些沒有Required屬性的屬性 - 如果你遺漏了它,一些驗證也不會發生。 @Eranga,如果你可以更新你的答案來包括它,那會很好,謝謝! – MVCDS 2016-04-17 14:25:01

+1

感謝@MVCDS您的評論拯救我的一天! – 2017-11-28 15:25:19