c# - 起订量 DbSet NotImplementedException

标签 c# entity-framework moq dbset

我有一个 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.

最佳答案

很可能您一直在使用 4.7.58 版的 Moq。该特定版本受 a regression 影响那会触发这样的 NotImplementedException .那回归has been fixed在 4.7.63 版中,所以我建议您将您的 Moq 包引用更新到 4.7.63 版或更新版本以解决此问题。

您的代码可以在 4.7.58 之前的 Moq 版本中运行的事实是由于一个“功能”,不幸的是,该功能导致的问题比解决的问题多得多。因此,该功能 was reverted .

Moq 已恢复到其原始行为,在此特定情况下,您需要通过 mock.As<TInterface> 设置各种接口(interface)成员调用mock.Object之前。 (通常,在 Moq 中,即使在检索模拟对象后执行更多设置也完全没问题;这种情况是一个明显的异常(exception)。希望这可以在 Moq 的 future 版本中得到修复。)

关于c# - 起订量 DbSet NotImplementedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46244563/

相关文章:

c# - 创建对象时注入(inject)属性

c# - mySQL .NET API - 从表中删除所有数据

c# - 从 Xamarin 表单启动 android 服务

entity-framework - VSTS 构建如何为 EF Core 添加更新数据库命令 Code First

c# - 使用 Task.Factory.StartNew().ContinueWith() 的单元测试代码

c# - Moq It.Is<> 不匹配

c# - 使用 Moq 验证是否调用了任一方法

c# - 适用于 Windows 桌面 C# 应用程序的蓝牙 4.0(低功耗)API

c# - 更新绑定(bind)的 LINQ to Entities 数据源

.net - 在 n 层应用程序中将连接字符串放在哪里?