相关疑难解决方法(0)

如何模拟 DocumentClient CreateDocumentQuery AsDocumentQuery

在这里只看到了两个问题,一个没有回答,一个是无法使用的答案(也许我只是没有得到它)​​。我想嘲笑这个:

var eventsFeed = this.documentClient.CreateDocumentQuery(this.collectionUri, 
sqlExpression, feedOptions).AsDocumentQuery();
var events = await eventsFeed.ExecuteNextAsync(cancellationToken); 
Run Code Online (Sandbox Code Playgroud)

我似乎只能收到此错误:

无法将“System.Linq.EnumerableQuery”类型的对象转换为“Microsoft.Azure.Documents.Linq.IDocumentQuery”

这里有一个可能的答案:

无法将“System.Linq.EnumerableQuery”类型的对象转换为“Microsoft.Azure.Documents.Linq.IDocumentQuery”

但是我找不到示例中使用的类型 JTokenEx 并且没有解释如何编写模拟代码?

理想情况下,我想返回一些模拟结果,以便我可以测试 ExecuteNextAsync。

作为参考,这是我发现与之相关的另一个问题,但同样没有得到回答:

如何(我应该)模拟 DocumentClient 以进行 DocumentDb 单元测试?

任何帮助将不胜感激。谢谢

c# linq azure azure-cosmosdb

6
推荐指数
0
解决办法
1466
查看次数

在使用Linq查询的单元测试中模拟IDocumentQuery

我正在编写单元测试DocumentDBRepository但是我得到了一个空引用异常.我使用Moq框架和XUnit.

这是我DocumentDBRepository课堂上的方法.

public class DocumentDBRepository<T> : IRepository<T> where T: class
{
    private static string DatabaseId;
    private static string CollectionId;
    private static IDocumentClient client;
    public DocumentDBRepository(IDocumentClient documentClient, string databaseId, string collectionId)
    {
        DatabaseId = databaseId;
        CollectionId = collectionId;
        client = documentClient;
        CreateDatabaseIfNotExistsAsync().Wait();
        CreateCollectionIfNotExistsAsync().Wait();
    }

    public async Task<IDocumentQuery<T>> GetQuery(Expression<Func<T, bool>> predicate)
    {
        try
        {
            IDocumentQuery<T> query = client.CreateDocumentQuery<T>(
          UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId),
          new FeedOptions { MaxItemCount = -1, EnableCrossPartitionQuery = true })
          .Where(predicate)
          .AsDocumentQuery();

            return query;
        }
        catch (Exception e) …
Run Code Online (Sandbox Code Playgroud)

unit-testing moq azure asp.net-core azure-cosmosdb

6
推荐指数
1
解决办法
1168
查看次数

能够使用查询表达式的模拟 IDocumentQuery

我需要能够模拟IDocumentQuery,以便能够测试查询文档集合并可能使用谓词来过滤它们的代码:

IQueryable<T> documentQuery = client
                .CreateDocumentQuery<T>(collectionUri, options);

if (predicate != null)
{
   documentQuery = documentQuery.Where(predicate);
}

var list = documentQuery.AsDocumentQuery();
var documents = new List<T>();           

while (list.HasMoreResults)
{
   documents.AddRange(await list.ExecuteNextAsync<T>());
}
Run Code Online (Sandbox Code Playgroud)

我使用/sf/answers/3493821341/的答案来编写以下方法:

public static IDocumentClient Create<T>(params T[] collectionDocuments)
{
    var query = Substitute.For<IFakeDocumentQuery<T>>();

    var provider = Substitute.For<IQueryProvider>();

    provider
        .CreateQuery<T>(Arg.Any<Expression>())                                                
        .Returns(x => query);

    query.Provider.Returns(provider);
    query.ElementType.Returns(collectionDocuments.AsQueryable().ElementType);
    query.Expression.Returns(collectionDocuments.AsQueryable().Expression);
    query.GetEnumerator().Returns(collectionDocuments.AsQueryable().GetEnumerator());

    query.ExecuteNextAsync<T>().Returns(x => new FeedResponse<T>(collectionDocuments));
    query.HasMoreResults.Returns(true, false);

    var client = Substitute.For<IDocumentClient>();

    client
        .CreateDocumentQuery<T>(Arg.Any<Uri>(), Arg.Any<FeedOptions>())
        .Returns(query);

    return client;
}
Run Code Online (Sandbox Code Playgroud)

只要不使用过滤,它就可以正常工作IQueryable.Where。 …

linq nsubstitute azure-cosmosdb

3
推荐指数
1
解决办法
913
查看次数