c# - 如何使用 DocumentDb 单元测试的过滤器模拟 DocumentClient CreateDocumentQuery?
问题描述
我正在为下面的代码编写单元测试,该代码使用带有 where(filter) 条件的 Document 客户端 CreateDocumentQuery 方法。
var documentQuery = ReadOnlyDocumentClient.CreateDocumentQuery<MyView>(UriFactory.CreateDocumentCollectionUri(Constants.COSMOS_DB_NAME, Constants.MY_VIEW_COL_NAME))
.Where(w => w.Name== query.Name)
.Where(w => w.DOB> query.StartDate && w.DOB < query.EndDate)
.AsDocumentQuery();
query 是一个命令参数,它是一个输入。
我正在使用 MOQ 来模拟,我正在使用下面的代码行来模拟
mockDocumentClient.Setup(s => s.CreateDocumentQuery<MyView>(It.IsAny<Uri>(), It.IsAny<FeedOptions>())).Returns(mockDocumentQuery.Object);
现在,上面的代码只模拟 CreateDocumentQuery 并且在执行 Where 条件时我没有得到模拟支持。
请建议我如何在 where 条件下模拟 CreateDocumentQuery?
提前致谢。
解决方案
当您模拟 时CreateDocumentQuery
,您还需要模拟与您期望的查询结果IQueryProvider
交互的。IEnumerable
这是一个例子:
// somewhere in your test class
public interface IFakeDocumentQuery<T> : IDocumentQuery<T>, IOrderedQueryable<T>
{
}
// somewhere in your test method
var expected = new List<YourType>
{
new YourType
{
yourField = "yourValue"
}
};
var mockDocumentClient = new Mock<IDocumentClient>();
var dataSource = expected.AsQueryable();
var response = new FeedResponse<YourType>(dataSource);
var mockDocumentQuery = new Mock<IFakeDocumentQuery<YourType>>();
// the part that gets the work done :)
var provider = new Mock<IQueryProvider>();
provider
.Setup(p => p.CreateQuery<YourType>(It.IsAny<Expression>()))
.Returns(mockDocumentQuery.Object);
mockDocumentQuery
.Setup(q => q.ExecuteNextAsync<YourType>(It.IsAny<CancellationToken>()))
.ReturnsAsync(response);
mockDocumentQuery
.SetupSequence(q => q.HasMoreResults)
.Returns(true)
.Returns(false);
mockDocumentQuery
.As<IQueryable<YourType>>()
.Setup(x => x.Provider)
.Returns(provider.Object);
mockDocumentQuery
.As<IQueryable<YourType>>()
.Setup(x => x.Expression)
.Returns(dataSource.Expression);
mockDocumentQuery
.As<IQueryable<YourType>>()
.Setup(x => x.ElementType)
.Returns(dataSource.ElementType);
mockDocumentQuery
.As<IQueryable<YourType>>()
.Setup(x => x.GetEnumerator())
.Returns(dataSource.GetEnumerator);
mockDocumentClient
.Setup(c => c.CreateDocumentQuery<YourType>(It.IsAny<Uri>(), It.IsAny<FeedOptions>()))
.Returns(mockDocumentQuery.Object);
我希望这会有所帮助!:)
推荐阅读
- wordpress - 如何在 Storefront 的顶部栏和页脚区域添加自定义框架
- progressive-web-apps - 使用 @nuxt/pwa 清除缓存后,渐进式 Web 应用程序不起作用
- c# - SqlException 出现时间过长
- node.js - npm SSL 错误:使用 sha512 时完整性校验和失败
- node.js - 如何在 ReactJS 中更新和预填充表单
- sql - 如何修复更新查询中的语法错误(缺少运算符)
- python - 为什么内联交换返回意外结果?
- azure - 将 Azure RM 值放入变量中
- qt - 是否可以使用 QSS 为选中的 QToolButton 设置样式?
- python - Python - 从数组中选择随机名称而不重复,直到全部选择