Moq DbSet NotImplementedException

时间:2017-09-15 17:08:22

标签: c# entity-framework moq dbset

我有一个直到最近一直工作的Moq DbSet,但是自上次更新依赖项以来,它一直在NotImplementedException上抛出IQueryable.Provider

代码使用如下:

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.

2 个答案:

答案 0 :(得分:3)

您可能使用的是Moq版本4.7.58。该特定版本受a regression影响,会触发此类NotImplementedException。版本4.7.63中的回归has been fixed,因此我建议您更新您的Moq软件包参考版本4.7.63或更新版本以解决此问题。

你的代码在4.7.58之前的Moq版本中工作的事实是由于一个“功能”,不幸的是它导致了比它解决的问题更多的问题。因此,该功能was reverted

Moq已恢复其原始行为,在此特定情况下,您需要通过mock.As<TInterface> 设置各种界面成员之前调用{ {1}} 即可。 (通常,在Moq中,即使在检索模拟对象之后执行更多设置也完全没问题;这种情况是一个值得注意的例外。希望这可以在Moq的未来版本中修复。)

答案 1 :(得分:0)

将Castle.Core回滚到4.0.0,将Moq回滚到支持4.0.0的最新版本解决了这个问题。我仍然想知道是否有一些我错过的东西会在新版本中解决这个问题。