2013-09-24 53 views
0

Moq在測試Mock<DbContext>Mock<DbSet<IEntity>>時是否正確考慮了數據註釋?例如,如果我嘗試執行代碼第一實體模型的數據註釋明確禁止的操作,是否會引發適當的驗證異常?如果不是,我該如何正確測試數據註解的預期結果?在實體框架中使用Moq測試數據註釋

編輯:我應該注意我正在使用Entity Framework 6,因爲它已經過大修,可以更好地使用Mock Frameworks。

回答

1

在單元測試中普遍接受的智慧是「不考你沒有自己的代碼」,所以在這種情況下,即使Moq能做到這一點(它可以因爲被提到不Ela,它只是提供了某個界面某些部分的假實現),你不應該 - 你必須接受由System.ComponentModel(或者其中任何一個)提供的DataAnnotations已經被他們的作者測試過,並且按照廣告的方式工作。

當然,如果您已經編寫了自己的自定義屬性,那麼您將在單獨的測試類中測試此註釋驗證代碼,該測試類會獨立於堆疊到屬性上測試其功能。

此外,因爲你有一個模擬DbContextEntitySet,我甚至不看到DataAnnotations進入它 - 他們也只是在一個實際的實體的一些實施單元測試有關,在這種情況下,你不應該在DbContextEntitySet附近的任何地方 - 你應該手動創建一個實體(或者嘲笑一個)來進行測試。隨時讓我們知道這些測試的背景是什麼!

更新: 爲了具有特定屬性的上一個特定的屬性存在迴歸測試,你可以使用反射:

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. 
     } 
    } 
} 

我不認爲有任何其他可靠的方法強制執行該要求,但後來我可能錯了......

+0

對,但我沒有測試以確保DataAnnotations工作,我正在測試以確保它們存在。如果有人不小心重構了[[Required]'屬性,那麼應該有一個失敗的測試,你不同意嗎? – JHixson

+0

@JHixson,道歉 - 你的問題明確指出「如果我試圖做一些被代碼第一實體模型的數據註釋明確禁止的東西,會引發適當的驗證異常」,但也許我誤解了它:) 無論如何 - 如果你想基本上「鎖定」你的實體上的一個特定字段必須具有'Required'屬性,那麼爲什麼不僅僅使用一個具有反射的單元測試呢?我會稍後用一些代碼更新我的答案。 –

+0

沒錯,我對嘲諷作品的理解缺乏瞭解,導致我誤解了我的問題。我沒有意識到mock是空的,並且希望如果由於驗證而導致'SaveChanges()'方法在生產中會失敗,那麼該方法在測試中也會失敗。我現在看到,測試應該比這更具體,檢查方法失敗的一個具體原因。因此嘲笑。 – JHixson

0

模擬只給你一個「僞造」的對象,它沒有實現任何功能。它只是控制代碼的一部分或防止空指針異常,因爲某些實例根本就沒有設置。但是沒有專門設置在模擬對象內的所有方法都不會做任何事情。

有一些如何單元測試實體框架的文章,也許這有助於。 例如:http://msdn.microsoft.com/en-us/ff714955.aspx