我需要在单元测试中验证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 ...
}
这感觉太复杂了,而且似乎是错误的做法. 有没有我遗漏的更简单的解决方案?