簡體   English   中英

在實體框架中使用Moq測試數據注釋

[英]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 DbContextEntitySet ,我什至看不到DataAnnotations進入的位置-它們僅在單元測試中與實際實體的某些實現相關,在這種情況下,您不應該在任何地方在DbContextEntitySet附近-您應該手動為即將進行的測試創建一個實體(或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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM