我有一个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.发布于 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的未来版本中得到解决。)
发布于 2017-09-15 17:13:49
将Castle.Core回滚到4.0.0,Moq回到支持4.0.0的最新版本,解决了这个问题。我仍然在想,是否有什么东西是我错过的,可以解决新版本中的这个问题。
https://stackoverflow.com/questions/46244563
复制相似问题