gpt4 book ai didi

c# - 如何使用用于 DocumentDb 单元测试的过滤器来模拟 DocumentClient CreateDocumentQuery?

转载 作者:太空狗 更新时间:2023-10-29 23:28:35 25 4
gpt4 key购买 nike

我正在为下面的代码编写单元测试,它使用带有 where(filter) 条件的文档客户端 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();

查询是一个命令参数,它是一个输入。

我正在使用 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);

希望对您有所帮助! :)

关于c# - 如何使用用于 DocumentDb 单元测试的过滤器来模拟 DocumentClient CreateDocumentQuery?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50897149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com