[英]Entity Framework Core FromSql mock test cases
我正在使用带有 get 存储过程调用的 EF Core 非实体模型。 请参阅下面的示例代码
context.Query<ClassDTO>().FromSql("SpName @Param1, @Param2, @Param3",
new SqlParameter[] { param1, param2, param3 }).ToList();
代码工作正常。 但是我需要编写模拟测试用例。
谁能帮我吗? 如何模拟Context.Query
或如何为此代码编写测试用例?
我试图实现以下方式:
https://nodogmablog.bryanhogan.net/2017/11/unit-testing-entity-framework-core-stored-procedures/
但它适用于 ** productContext.Products.MockFromSql(...)
但对我来说它就像 productContext.Query.MockFromSql()。 所以建议我如何编写测试用例。
提前致谢。
湿婆
为DbQuery<TQuery>
设置的实际 FromSql 模拟与DbSet<TEntity>
相同,因此 OP 链接是相关的(尽管它是一个全面的实现,如果您需要匹配您需要的 FromSql sql/参数进行额外的模拟设置;警告:它很快就会变得丑陋)。
您需要使用可查询序列模拟DbQuery<TQuery>
,根据 OP 链接模拟查询提供程序(扩展为您需要的任何特定模拟匹配),然后将 DbQuery 模拟对象分配给 DbContext .Query<TQuery>()
方法和 DbContext DbQuery<TQuery>
属性。
在模拟 DbQuery 方面,这就是我用来创建的:
public static Mock<DbQuery<TQuery>> CreateDbQueryMock<TQuery>(this DbQuery<TQuery> dbQuery, IEnumerable<TQuery> sequence) where TQuery : class {
var dbQueryMock = new Mock<DbQuery<TQuery>>();
var queryableSequence = sequence.AsQueryable();
dbQueryMock.As<IAsyncEnumerableAccessor<TQuery>>().Setup(m => m.AsyncEnumerable).Returns(queryableSequence.ToAsyncEnumerable);
dbQueryMock.As<IQueryable<TQuery>>().Setup(m => m.ElementType).Returns(queryableSequence.ElementType);
dbQueryMock.As<IQueryable<TQuery>>().Setup(m => m.Expression).Returns(queryableSequence.Expression);
dbQueryMock.As<IEnumerable>().Setup(m => m.GetEnumerator()).Returns(queryableSequence.GetEnumerator());
dbQueryMock.As<IEnumerable<TQuery>>().Setup(m => m.GetEnumerator()).Returns(queryableSequence.GetEnumerator());
dbQueryMock.As<IQueryable<TQuery>>().Setup(m => m.Provider).Returns(queryableSequence.Provider);
return dbQueryMock;
}
然后,如果我需要支持 FromSql,我将提供程序更改为查询提供程序模拟(根据 OP 为 CreateQuery 设置的模拟):
mock.As<IQueryable<TEntity>>().Setup(m => m.Provider).Returns(queryProviderMock.Object);
如果您想节省一些时间,我最终将上述内容包装在一个库中: https : //github.com/rgvlee/EntityFrameworkCore.Testing
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.