c# - 模拟数据库集EF Core 5 中的 .FromSqlRaw
问题描述
其中一个存储库方法恰好用于FromSqlRaw
通过存储过程从 SQL Server 获取数据。
我正在尝试围绕它编写单元测试,但到目前为止还没有运气。
这是我走了多远的示例片段
var fixture = new Fixture();
var context = new Mock<IMyDbContext>();
var dbSet = new Mock<DbSet<MyEntity>>();
var data = fixture.Build<MyEntity>().CreateMany().AsQueryable();
dbSet.As<IQueryable<MyEntity>>().Setup(m => m.Provider).Returns(data.Provider);
dbSet.As<IQueryable<MyEntity>>().Setup(m => m.Expression).Returns(data.Expression);
dbSet.As<IQueryable<MyEntity>>().Setup(m => m.ElementType).Returns(data.ElementType);
dbSet.As<IQueryable<MyEntity>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
context.Setup(c => c.Set<MyEntity>()).Returns(dbSet.Object);
var repository = new MyRepository(context.Object);
var result = await repository.GetData();
位我陷入了以下异常
System.InvalidCastException:无法将“System.Linq.Expressions.ConstantExpression”类型的对象转换为“Microsoft.EntityFrameworkCore.Query.QueryRootExpression”类型
该项目使用 EF Core 5。
知道如何解决这个强制转换异常吗?
解决方案
不要嘲笑 IQueryable——你只是在寻求一个痛苦的世界。使用模拟存储库(可能由内存中的 DbContext 支持)对消费类进行单元测试。添加一些集成测试以验证您的真实存储库实现。
有关更多详细信息,请参阅文档中使用 EF Core 的测试代码。
推荐阅读
- python - Tkinter:创建任意数量的按钮
- reactjs - 使用状态钩子将类组件重写为功能组件时如何编写`this.props`?
- android - 将 JWT 身份验证令牌添加到 OkHttp 、 Dagger 2 和 Retrofit
- jakarta-ee - jersey-client - NoSuchMethodError: MultivaluedMap.addAll
- mongodb - 存储和查询 NxN 矩阵
- javascript - 如何在.on事件nodejs中调用异步函数
- notepad++ - 具有等效记事本++功能的linux图形文本编辑器:不要丢失未保存的文件
- php - 如何修复 Laravel 5.6 中模型 [App\User] settingedit 没有查询结果?
- vue.js - Vuex 应用程序中“路由器”和“商店”之间的循环依赖关系
- angular - 在弹出窗口中完成身份验证后,如何在角度组件中显示数据?