繁体   English   中英

Entity Framework Core FromSql 模拟测试用例

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM