为了账号安全,请及时绑定邮箱和手机立即绑定

AutoFixture - 添加自定义,以便使用对象 id 创建所有字典键

AutoFixture - 添加自定义,以便使用对象 id 创建所有字典键

C#
暮色呼如 2023-09-24 16:13:57
我不确定这是否可能,但我认为值得一问。我们有许多对象,这些对象具有其他子对象的层次结构。我们不使用一系列 IEnumerable 集合,而是使用字典,这样当在 MongoDb 中查询数据时,可以轻松/快速地遍历层次结构。例如:在主模型中,我们有类似的内容:public Dictionary<string, TopLevelGroup> TopGroups { get; set; }然后在 TopLevelGroup 中我们有类似的内容:public Dictionary<string, SecondLevelGroup> SecondLevelGroups { get; set; }键必须是一个字符串,以便它可以作为 ReferencedDictionary 存储在 Mongo 中(我认为这是正确的),并且可以通过执行以下操作来访问数据:TopLevelGroup[keyA].SecondLevelGroup[keyB].Property所有键都是对象的 id 属性(它们也有一个通用的 IDocument 接口,它要求所有文档都有一个 Id ...当然)。所以我想要在 AutoFixture 中做的是让所有自动生成的字典都使用对象的 Id 作为键(而不是随机生成的字符串)。我怀疑这有点疯狂并且不受支持,但我想问一下以防万一,因为我目前不太了解 AutoFixture。
查看完整描述

1 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

不,这一点也不疯狂,而且是受支持的。

这种情况正是定制方法的用处。

使用该方法,您可以自定义对象的创建方式。

你也许可以这样做:

fixture.Customize<TopLevelGroup>(
    c => c.With(
        propertyPicker: x => x.SecondLevelGroups, 
        valueFactory: (IEnumerable<SecondLevelGroup> input) => input.ToDictionary(y => y.Id)));

fixture.Customize<MainModel>(
    c => c.With(
        propertyPicker: x => x.TopGroups, 
        valueFactory: (IEnumerable<TopLevelGroup> input) => input.ToDictionary(y => y.Id)));

With方法用于指定属性的值。第一个参数是 propertypicker,例如x => x.SecondLevelGroups

第二个参数是一个值或一个 valuefactory。valuefactory 可以接受一个输入,自动固定装置将填充该输入。例如,IEnumerable<SecondLevelGroup>我们可以将其转换为具有我们想要的键的字典。


查看完整回答
反对 回复 2023-09-24
  • 1 回答
  • 0 关注
  • 89 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信