【问题标题】:How to mock DocumentClient CreateDocumentQuery with filters for DocumentDb unit testing?如何使用 DocumentDb 单元测试的过滤器模拟 DocumentClient CreateDocumentQuery?
【发布时间】:2019-07-25 23:34:47
【问题描述】:

我正在为下面的代码编写单元测试,该代码使用带有 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 条件下模拟 CreateDocumentQuery?

提前致谢。

【问题讨论】:

标签: c# unit-testing documentclient


【解决方案1】:

当您模拟CreateDocumentQuery 时,您还需要模拟与您期望作为查询结果的IEnumerable 交互的IQueryProvider

这是一个例子:

        // 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);

希望对您有所帮助! :)

【讨论】:

    【解决方案2】:

    您可以尝试以下示例:

    var documentClientMock = new Mock<IDocumentClient>();
    var docs = new List<MyView>();//your mock data
    documentClientMock.Setup(d => d.CreateDocumentQuery<MyView>(It.IsAny<Uri>(), It.IsAny<FeedOptions>()))
        .Returns((IOrderedQueryable<MyView>) docs.AsQueryable());
    

    【讨论】:

      猜你喜欢
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 2018-11-05
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多