Autofixtures "With"-使用 Build<T> 时忽略自定义
Autofixtures "With"-Customizations for are ignored when using Build<T>
我的目标是能够只定义与特定测试相关的参数,在 c# 中使用不可变类型(严格构造函数注入,无设置器),并让自定义的夹具处理有效值对于测试中未指定的参数。
这让我抓狂 - 我的 "with" 属性- 字符串、DateTime 和 int 的自定义被忽略了。基于 "Guest" 的示例:
public class Guest
{
public readonly string GuestId;
public readonly string GivenName;
public readonly string SurName;
public readonly AgeCode AgeCategory;
public Guest(string guestid, AgeCode ageCategory, string givenName, string surName)
{
AgeCategory = ageCategory;
GivenName = givenName;
SurName = surName;
GuestId = guestid;
}
}
我像这样自定义了一个 Fixture 实例:
fixture.Customize<Guest>(composer =>
composer
.With(g => g.GivenName, "Finn")
.With(g => g.GuestId, "1")
.With(g => g.SurName, "Rasmussen")
);
...在使用 fixture.Create<Guest>()
时有效,但在使用 fixture.Build<Guest>().With(g=>g.Surname, "Olsen")
时无效。
查看 AutoFixture 签名,我知道这是因为 Fixture.Build<T>()
实例化了一个新的作曲家,并且该作曲家没有作为 Customize<T>
方法的 'composer' 实例注入。
另外 - 我知道 属性 "wins" 的第一个定制,所以 "overwrites" 必须被推到定制的前面...
有什么建议吗?我在这里完全不对劲,试图用螺丝刀敲钉子吗?或者我只是没有看到这里明显的聪明 and/or...
对于发现此问题的其他人:
可以使用
更改构建类型的默认策略
Fixture.Register<TType>(Func<TType> creator)
很有魅力...
我的目标是能够只定义与特定测试相关的参数,在 c# 中使用不可变类型(严格构造函数注入,无设置器),并让自定义的夹具处理有效值对于测试中未指定的参数。
这让我抓狂 - 我的 "with" 属性- 字符串、DateTime 和 int 的自定义被忽略了。基于 "Guest" 的示例:
public class Guest
{
public readonly string GuestId;
public readonly string GivenName;
public readonly string SurName;
public readonly AgeCode AgeCategory;
public Guest(string guestid, AgeCode ageCategory, string givenName, string surName)
{
AgeCategory = ageCategory;
GivenName = givenName;
SurName = surName;
GuestId = guestid;
}
}
我像这样自定义了一个 Fixture 实例:
fixture.Customize<Guest>(composer =>
composer
.With(g => g.GivenName, "Finn")
.With(g => g.GuestId, "1")
.With(g => g.SurName, "Rasmussen")
);
...在使用 fixture.Create<Guest>()
时有效,但在使用 fixture.Build<Guest>().With(g=>g.Surname, "Olsen")
时无效。
查看 AutoFixture 签名,我知道这是因为 Fixture.Build<T>()
实例化了一个新的作曲家,并且该作曲家没有作为 Customize<T>
方法的 'composer' 实例注入。
另外 - 我知道 属性 "wins" 的第一个定制,所以 "overwrites" 必须被推到定制的前面...
有什么建议吗?我在这里完全不对劲,试图用螺丝刀敲钉子吗?或者我只是没有看到这里明显的聪明 and/or...
对于发现此问题的其他人: 可以使用
更改构建类型的默认策略Fixture.Register<TType>(Func<TType> creator)
很有魅力...