首页 > 解决方案 > 模拟数据库集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。

知道如何解决这个强制转换异常吗?

标签: c#entity-framework-coreef-core-5.0

解决方案


不要嘲笑 IQueryable——你只是在寻求一个痛苦的世界。使用模拟存储库(可能由内存中的 DbContext 支持)对消费类进行单元测试。添加一些集成测试以验证您的真实存储库实现。

有关更多详细信息,请参阅文档中使用 EF Core 的测试代码。


推荐阅读