如何模擬EntityFramework的IQueryable實現(xiàn)的局限性我目前正在為MVC4應(yīng)用程序中的存儲庫實現(xiàn)編寫單元測試。為了模擬數(shù)據(jù)上下文,我開始采用這篇文章中的一些想法,但我現(xiàn)在發(fā)現(xiàn)了一些限制,讓我懷疑是否有可能正確模擬IQueryable。特別是,我已經(jīng)看到了一些測試通過但代碼在生產(chǎn)中失敗的情況,并且我無法找到任何方法來模擬導(dǎo)致此失敗的行為。例如,以下代碼段用于選擇Post屬于預(yù)定義類別列表的實體:var posts = repository.GetEntities<Post>(); // Returns IQueryable<Post>var categories = GetCategoriesInGroup("Post"); // Returns a fixed list of type Categoryvar filtered = posts.Where(p => categories.Any(c => c.Name == p.Category)).ToList();在我的測試環(huán)境中,我試圖嘲弄posts使用假DbSet上面提到的實施,同時也通過創(chuàng)建List的Post實例并將其轉(zhuǎn)換為IQueryable使用AsQueryable()擴(kuò)展方法。這兩種方法都在測試條件下工作,但代碼實際上在生產(chǎn)中失敗,但有以下例外:System.NotSupportedException : Unable to create a constant value of type 'Category'. Only primitive types or enumeration types are supported in this context.雖然像這樣的LINQ問題很容易解決,但真正的挑戰(zhàn)是找到它們,因為它們不會在測試環(huán)境中顯示出來。我期望我可以嘲笑實體框架的實施行為,這是不現(xiàn)實的IQueryable嗎?謝謝你的想法,蒂姆。
如何模擬EntityFramework的IQueryable實現(xiàn)的局限性
茅侃侃
2019-08-17 16:07:21