编程语言
首页 > 编程语言> > c# – Moq DbSet NotImplementedException

c# – Moq DbSet NotImplementedException

作者:互联网

我有一个直到最近一直工作的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.

解决方法:

有可能你一直在使用Moq的4.7.58版本.该特定版本受到a regression的影响,会触发此类NotImplementedException.回归has been fixed版本4.7.63,所以我建议你更新你的Moq包参考版本4.7.63或更新版本来解决这个问题.

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

Moq已经恢复到原来的行为,在这种情况下,你需要通过mock设置各种接口成员.作为< TInterface>在调用mock.Object之前. (通常,在Moq中,即使在检索模拟对象之后执行更多设置也完全没问题;这种情况是一个值得注意的例外.希望这可以在Moq的未来版本中修复.)

标签:c,entity-framework,moq,dbset
来源: https://codeday.me/bug/20190701/1348947.html