相关疑难解决方法(0)

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

从新的CosmosDb模拟器我得到了一个存储库来执行基本的documentdb操作,这个存储库被注入其他类.我想对基本查询进行单元测试.

public class DocumentDBRepository<T> where T : class
{
 //Details ommited...

    public IQueryable<T> GetQueryable()
    {
        return _client.CreateDocumentQuery<T>(
            UriFactory.CreateDocumentCollectionUri(_databaseId, _collectionId),
            new FeedOptions { MaxItemCount = -1, EnableCrossPartitionQuery = true });
    }

    public async Task<IEnumerable<T>> ExecuteQueryAsync(IQueryable<T> query)
    {
        IDocumentQuery<T> documentQuery = query.AsDocumentQuery();
        List<T> results = new List<T>();
        while (documentQuery.HasMoreResults)
        {
            results.AddRange(await documentQuery.ExecuteNextAsync<T>());
        }

        return results;
    }


}
Run Code Online (Sandbox Code Playgroud)

此存储库需要一个文档客户端才能工作,它也会在构造函数上注入.

public DocumentDBRepository(string databaseId, IDocumentClient client)
{
    _client = client;
    _databaseId = databaseId;
    _collectionId = GetCollectionName();
}
Run Code Online (Sandbox Code Playgroud)

我最初的方法是使用CosmosDb模拟器,但这需要模拟器运行我不喜欢并使测试更慢.

我的第二种方法是尝试使用文档客户端的模拟.

var data = new List<MyDocumentClass>
{ …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing moq azure-cosmosdb

18
推荐指数
1
解决办法
7380
查看次数

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

我正在使用单元测试来测试DocumentDBRepository课程。我按照这篇文章作为 SQL 查询用例的示例。但它显示错误

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

这是我的DocumentDBRepository课程代码

private IDocumentQuery<T> GetQueryBySQL(string queryStr)
{
    var uri = UriFactory.CreateDocumentCollectionUri(_databaseId, _collectionId);
    var feedOptions = new FeedOptions { MaxItemCount = -1, EnableCrossPartitionQuery = true };
    IQueryable<T> filter = _client.CreateDocumentQuery<T>(uri, queryStr, feedOptions); 
    IDocumentQuery<T> query = filter.AsDocumentQuery();
    return query;

}

public async Task<IEnumerable<T>> RunQueryAsync(string queryString)
{
    IDocumentQuery<T> query = GetQueryBySQL(queryString);

    List<T> results = new List<T>();

    while (query.HasMoreResults)
    {
        results.AddRange(await query.ExecuteNextAsync<T>());
    }
    return results;
}
Run Code Online (Sandbox Code Playgroud)

这是我的测试类的代码

public async virtual Task Test_GetEntitiesAsyncBySQL()
{
    var id …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing moq azure azure-cosmosdb

7
推荐指数
1
解决办法
2567
查看次数

能够使用查询表达式的模拟 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
查看次数

标签 统计

azure-cosmosdb ×3

c# ×2

moq ×2

unit-testing ×2

azure ×1

linq ×1

nsubstitute ×1