首页 > 解决方案 > 如何使用 XUnit 对 Cosmos DB 中的 LINQ 查询进行单元测试

问题描述

    public async Task<List<Group>?> GetInfosforGroupIdAsync(string groupId)
    {
           Container? cosmosContainer =
           await database.CreateContainerIfNotExistsAsync("Group", "/GroupId");
           if (groupId == null)
              return null;
                
           var query = cosmosContainer.GetItemLinqQueryable<Group>()
                    .Where(d => d.GroupId == groupId);
           var queryResult = query.ToFeedIterator();
           if (queryResult.HasMoreResults)
           {
               FeedResponse<Group> currentResultSet = await queryResult.ReadNextAsync();
               List<DedupeGroup> result = currentResultSet.ToList<Group>();
               return result;
           }
           return null;
   }

如何使用测试为上述方法编写单元xunit测试。假设Group如下

class Group{
  string GroupId;
  string GroupInfo;
}

标签: c#linqunit-testingazure-cosmosdbxunit

解决方案


这通常不是一个好主意。如果您真的想对所示方法进行单元测试,则需要创建所有使用的 Cosmos DB 类的模型。这将是大量代码而几乎没有回报(甚至是负净值,因为必须维护测试,可能包含错误等)。但这还不是最大的问题。

你可以把你真正想要单元测试的东西分解出来,然后只测试它,即 LINQ 表达式。您可以IQueryable通过使用普通的 in-memory 模拟它来测试它IEnumerable。但这实际上通常不起作用,因为 LINQ 查询的IEnumerable行为不像针对 Cosmos DB 的 LINQ 查询。例如,C# 中的 null- coalesce运算????(记忆。c['foo']KeyNotFoundException

不幸的是,目前没有可用的内存模拟CosmosClient。因此,您必须编写自己的 LINQ 提供程序来解释 LINQ 查询,就像Cosmos DB 所做的那样,但是在内存中,这将是大量工作,而回报却很少。


推荐阅读