[英]Testing Data Annotations using Moq in Entity Framework
Moq在測試Mock<DbContext>
和Mock<DbSet<IEntity>>
是否正確考慮了數據注釋? 例如,如果我嘗試執行代碼優先實體模型的數據注釋明確禁止的操作,是否會拋出適當的驗證異常? 如果沒有,如何正確測試數據注釋的預期結果?
編輯:我應該注意,我使用的是Entity Framework 6,因為它已經過全面改進,可以更好地與Mock Frameworks協同工作。
單元測試中普遍接受的智慧是“不要測試您不擁有的代碼”,因此在這種情況下,即使Moq
可以做到(而且不能這樣做,因為正如Ela所提到的,它只是提供了某些實現的虛假實現)接口的一部分),您不應該-必須接受System.ComponentModel
(或任何一種)提供的DataAnnotations
已經過其作者的測試,並能按廣告規定工作。
當然,如果您編寫了自己的自定義屬性,則可以在一個單獨的測試類中對該注釋驗證代碼進行單元測試,該類獨立於將其堆疊到屬性上來對其功能進行測試。
另外,假設您具有Mock DbContext
和EntitySet
,我什至看不到DataAnnotations進入的位置-它們僅在單元測試中與實際實體的某些實現相關,在這種情況下,您不應該在任何地方在DbContext
或EntitySet
附近-您應該手動為即將進行的測試創建一個實體(或DbContext
一個實體)。 隨時讓我們知道這些測試的內容是什么!
更新:為了對特定屬性上特定屬性的存在進行回歸測試,可以使用反射:
public void MyEntityClass_PropertyFoo_HasRequiredAttribute()
{
var prop = typeof(MyEntity).GetProperties().FirstOrDefault(p=>p.Name=="Foo");
if (prop!=null)
{
object[] attributes = prop.GetCustomAttributes(typeof(RequiredAttribute), true);
if (attributes.Length==0)
{
//someone took it out, explode your test here.
}
}
}
我認為沒有其他可靠的方法可以執行該要求,但是我可能還是錯了。
模擬僅給您一個“偽造的”對象,它沒有實現任何功能。 這只是為了控制代碼的一部分或防止空指針異常,因為根本沒有設置某些實例。 但是,不是在模擬對象中專門設置的所有方法都不會做任何事情。
關於如何對實體框架進行單元測試的某些文章,也許會有所幫助。 例如: http : //msdn.microsoft.com/en-us/ff714955.aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.