我需要在单元测试中验证AggregateAsync方法是否收到了通过PipelineDefinition<BsonDocument, BsonDocument>实例表示的特定聚合命令. 命令是$collStats,带有附加的字段/选项storageStats. 如何判断管道是否包含此命令,包括附加字段?

我可以用Stages得到流水线的individual stages,所以我可以验证只有一个阶段(包含上面的命令),然后得到这个阶段:

PipelineDefinition<BsonDocument, BsonDocument> pipeline = ...; // obtained from some callback
IPipelineStageDefinition stage = pipeline.Stages.Single();

现在,我可以很容易地判断此阶段是否包含带有OperatorName$collStats命令:

if (stage.OperatorName == "$collStats")
{
    // check for additional "storageStats" field
}

但是如何判断该命令是否也包含字段storageStats呢? 不幸的是,似乎没有像OperatorFields这样的类似房产. 我目前找到的唯一解决方案是序列化Stage,然后判断这个序列化的表示是否包含特定的字段:

using MongoDB.Bson.Serialization;

BsonDocument command = stage.Render(
    BsonSerializer.SerializerRegistry.GetSerializer<BsonDocument>(),
    BsonSerializer.SerializerRegistry).Document;
BsonDocument fields = command.GetValue("$collStats").ToBsonDocument();

if (fields.Contains("storageStats"))
{
    // finally ...
}

这感觉太复杂了,而且似乎是错误的做法. 有没有我遗漏的更简单的解决方案?

推荐答案

要验证MQL查询,您必须呈现它.这样做的原因是,可以用不同的方式创建管道,但并不总是基于已呈现的BsonDocument. 因此,它可能是在上面的代码中呈现一个stage,或者呈现整个管道(基本上是相同的):

        var registry = BsonSerializer.SerializerRegistry;
        var serializer = registry.GetSerializer<BsonDocument>();
        var renderedStages = pipeline.Render(serializer, registry).Documents

您也可以在CommandStartedEvent上配置事件订阅者(参见here),但我怀疑您在这里是否需要服务器呼叫

Csharp相关问答推荐

循环访问Android视图中动态创建的子视图

获取Windows和Linux上的下载文件夹

为什么.Equals(SS,StringComparison. ClientCultureIgnoreCase)在Net 4.8和6.0之间不同?

解析需要HttpClient和字符串的服务

始终保留数组中的最后N个值,丢弃最老的

System.Text.Json数据化的C#类映射

当我没有此令牌时,为什么语法报告EOF错误?

JsonSchema.Net删除假阳性判断结果

在.NET 8最低API中从表单绑定中排除属性

HelperText属性不支持复杂内容(混合C#和标记)

如何在同一成员上组合[JsonPropertyName]和[ObservableProperty]?

如何在ASP.NET Core 8中获取键控服务词典

Autofac -动态实例化:手动传递构造函数

当`JToken?`为空时?

如何从原始图像到新创建的图像获得相同的特定 colored颜色 ,并且具有相同的 colored颜色 量和相同的宽度和高度?

反序列化我以前使用System.Text.Json序列化的文件时出现异常

S,在.NET核心控制台应用程序中,AddScope和AddSingleton有什么不同?

实例化列表时的集合表达式是什么?

如何根据分割文本的块数来计算文本的大小?

.NET6最小API:操作.MapGet之后的响应