首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Moq DbSet NotImplementedException

Moq DbSet NotImplementedException
EN

Stack Overflow用户
提问于 2017-09-15 17:08:21
回答 2查看 2.3K关注 0票数 5

我有一个Moq DbSet,直到最近才开始工作,但是自从上次更新依赖项之后,它一直在IQueryable.Provider上抛出一个NotImplementedException

所用代码如下:

代码语言:javascript
复制
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

引发的异常如下:

代码语言:javascript
复制
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.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-17 08:33:18

很可能您一直在使用Moq的4.7.58版本。这个特定的版本受到了回归的影响,它会触发这样一个NotImplementedException。版本4.7.63中的回归已经修好了,因此我建议您将包引用更新为4.7.63版本或更高版本的,以解决此问题。

您的代码在4.7.58之前就可以在Moq版本中工作,这是因为一个“特性”,它不幸地造成了比它解决的更多的问题。出于这个原因,这个特性是重归的。

Moq又回到了它最初的行为,在这个特殊的场景中,您需要在调用mock.As<TInterface> mock.Object.之前通过在之前设置各种接口成员。(通常,在Moq中,即使在检索了模拟对象之后也可以执行更多的设置;这个场景是一个明显的例外。希望这能在Moq的未来版本中得到解决。)

票数 4
EN

Stack Overflow用户

发布于 2017-09-15 17:13:49

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46244563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档