【发布时间】:2017-09-15 17:08:21
【问题描述】:
我有一个最近一直在工作的 Moq DbSet,但是自从上次更新依赖项以来,它一直在 IQueryable.Provider 上抛出 NotImplementedException
使用的代码如下:
var mockSet = new Mock<DbSet<A>>();
var list = new List<A>();
var queryable = list.AsQueryable();
mockSet.As<IQueryable<A>>().Setup(m => m.Provider).Returns(queryable.Provider);
mockSet.As<IQueryable<A>>().Setup(m => m.Expression).Returns(queryable.Expression);
mockSet.As<IQueryable<A>>().Setup(m => m.ElementType).Returns(queryable.ElementType);
mockSet.As<IQueryable<A>>().Setup(m => m.GetEnumerator()).Returns(() => queryable.GetEnumerator());
var f =mockSet.Object.FirstOrDefault(); // NotImplementedException thrown here
抛出的异常如下:
System.NotImplementedException
The member 'IQueryable.Provider' has not been implemented on type
'DbSet`1Proxy_1' which inherits from 'DbSet`1'.
Test doubles for 'DbSet`1' must provide implementations of methods
and properties that are used.
【问题讨论】:
-
这篇 Microsoft 文章提供了一种实现,允许您使用内存中的测试替身。我刚刚更新了我的 Moq 4.7.99 和 Castle.Core 4.1.1,我的测试通过了。 msdn.microsoft.com/en-us/library/dn314431(v=vs.113).aspx
-
这很有帮助。可悲的是,我经常发现更高级的 MSDN 文章基本上只是被编成一个庞大的列表。
-
在内存数据库中使用
Sqlite将提供更好的测试体验,因为您不受如何构建查询的限制。只需插入所需数据,运行查询,检查预期结果
标签: c# entity-framework moq dbset