c# - 如何使用 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;
}
解决方案
这通常不是一个好主意。如果您真的想对所示方法进行单元测试,则需要创建所有使用的 Cosmos DB 类的模型。这将是大量代码而几乎没有回报(甚至是负净值,因为必须维护测试,可能包含错误等)。但这还不是最大的问题。
你可以把你真正想要单元测试的东西分解出来,然后只测试它,即 LINQ 表达式。您可以IQueryable
通过使用普通的 in-memory 模拟它来测试它IEnumerable
。但这实际上通常不起作用,因为 LINQ 查询的IEnumerable
行为不像针对 Cosmos DB 的 LINQ 查询。例如,C# 中的 null- coalesce运算??
符??
(记忆。c['foo']
KeyNotFoundException
不幸的是,目前没有可用的内存模拟CosmosClient
。因此,您必须编写自己的 LINQ 提供程序来解释 LINQ 查询,就像Cosmos DB 所做的那样,但是在内存中,这将是大量工作,而回报却很少。
推荐阅读
- c - 链表:未分配被释放的指针
- angular - 如何在导航后刷新 Ionic 4 页面
- sql - 如何在以下场景中使用复合索引
- bash - 语法错误:算术运算符无效(错误标记是“
- mysql - 如何将 2 个 select 语句和输出结果合并到 2 列中
- android - 将多个图像路径保存到实时数据库 Firebase
- coq - 如何使用 `coqc` 命令可靠地编译 Coq 代码?
- sharepoint - 我是否需要权限才能在 Sharepoint 上运行 SPServices?
- vue.js - 如何区分 Chrome 开发工具中同名的 VueJS + WebPack 模块?
- logstash - Grok 过滤器与 bro httplog 数据不匹配