Moq在測試Mock<DbContext>
和Mock<DbSet<IEntity>>
時是否正確考慮了數據註釋?例如,如果我嘗試執行代碼第一實體模型的數據註釋明確禁止的操作,是否會引發適當的驗證異常?如果不是,我該如何正確測試數據註解的預期結果?在實體框架中使用Moq測試數據註釋
編輯:我應該注意我正在使用Entity Framework 6,因爲它已經過大修,可以更好地使用Mock Frameworks。
Moq在測試Mock<DbContext>
和Mock<DbSet<IEntity>>
時是否正確考慮了數據註釋?例如,如果我嘗試執行代碼第一實體模型的數據註釋明確禁止的操作,是否會引發適當的驗證異常?如果不是,我該如何正確測試數據註解的預期結果?在實體框架中使用Moq測試數據註釋
編輯:我應該注意我正在使用Entity Framework 6,因爲它已經過大修,可以更好地使用Mock Frameworks。
在單元測試中普遍接受的智慧是「不考你沒有自己的代碼」,所以在這種情況下,即使Moq
能做到這一點(它可以因爲被提到不Ela,它只是提供了某個界面某些部分的假實現),你不應該 - 你必須接受由System.ComponentModel
(或者其中任何一個)提供的DataAnnotations
已經被他們的作者測試過,並且按照廣告的方式工作。
當然,如果您已經編寫了自己的自定義屬性,那麼您將在單獨的測試類中測試此註釋驗證代碼,該測試類會獨立於堆疊到屬性上測試其功能。
此外,因爲你有一個模擬DbContext
和EntitySet
,我甚至不看到DataAnnotations進入它 - 他們也只是在一個實際的實體的一些實施單元測試有關,在這種情況下,你不應該在DbContext
或EntitySet
附近的任何地方 - 你應該手動創建一個實體(或者嘲笑一個)來進行測試。隨時讓我們知道這些測試的背景是什麼!
更新: 爲了具有特定屬性的上一個特定的屬性存在迴歸測試,你可以使用反射:
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
對,但我沒有測試以確保DataAnnotations工作,我正在測試以確保它們存在。如果有人不小心重構了[[Required]'屬性,那麼應該有一個失敗的測試,你不同意嗎? – JHixson
@JHixson,道歉 - 你的問題明確指出「如果我試圖做一些被代碼第一實體模型的數據註釋明確禁止的東西,會引發適當的驗證異常」,但也許我誤解了它:) 無論如何 - 如果你想基本上「鎖定」你的實體上的一個特定字段必須具有'Required'屬性,那麼爲什麼不僅僅使用一個具有反射的單元測試呢?我會稍後用一些代碼更新我的答案。 –
沒錯,我對嘲諷作品的理解缺乏瞭解,導致我誤解了我的問題。我沒有意識到mock是空的,並且希望如果由於驗證而導致'SaveChanges()'方法在生產中會失敗,那麼該方法在測試中也會失敗。我現在看到,測試應該比這更具體,檢查方法失敗的一個具體原因。因此嘲笑。 – JHixson