Testing 我可以告诉AutoFixture为从它继承的类的所有实例调用一些基方法吗?

Testing 我可以告诉AutoFixture为从它继承的类的所有实例调用一些基方法吗?,testing,autofixture,Testing,Autofixture,我有一个实体类,它公开了一个只读Id属性。此属性在保存后通过ORM设置(不再是暂时的)。我希望AutoFixture调用一个方法,该方法在内部为从实体继承的类的所有实例设置Id属性 有几个自定义应用于装置,这些自定义注册了这些子体的创建,所以我想确保它们首先运行。我想理想的情况是允许我在从fixture返回匿名值之前运行一些修改代码 例如,当我调用fixture.CreateAnonymous()时,会有一些其他自定义项(或类似项)可以在返回订单实例之前对其进行修改 这种修改不仅会截取订单,还会

我有一个
实体
类,它公开了一个只读Id属性。此属性在保存后通过ORM设置(不再是暂时的)。我希望AutoFixture调用一个方法,该方法在内部为从实体继承的类的所有实例设置Id属性

有几个自定义应用于装置,这些自定义注册了这些子体的创建,所以我想确保它们首先运行。我想理想的情况是允许我在从fixture返回匿名值之前运行一些修改代码

例如,当我调用fixture.CreateAnonymous()时,会有一些其他自定义项(或类似项)可以在返回订单实例之前对其进行修改


这种修改不仅会截取
订单
,还会截取任何
实体
后代。

在使用扩展Fixture的自定义类解决此问题后,我听取了Ruben和Mark的建议。我通过ICustomization创建了相同的基本解决方案,ICustomization通过我现有的自定义CompositeCustomization应用。下面是新的自定义设置,用于在通过CreateAnonymous返回实例之前设置实体ID

public类SetEntityIdCustomization:ICCustomization{
公共空间自定义(iTexture装置){
var引擎=((夹具)夹具).engine;
fixture.Customizations.Add(新的后处理器(
发动机,o=>{
var实体=o作为基本实体;
if(entity==null | |!entity.IsTransient()){
返回;
}
entity.SetId(fixture.CreateAnonymous());
}));
}
}

是切向相关的(或者,如果你认为这太接近了,你可以VTC,我自己也不确定),因为我想在装置中的所有iSpecimenBuilder上运行一个后处理器,所以我劫持了装置。酷。我个人唯一要做的就是将其提取为一个
iccustomization
,以便能够单独应用它们,并给行为一个意图揭示的名称,但显然,只要你的套件中继续只有一个自定义项,这在功能上就相当于你拥有的。我有很多自定义项正在进行由AutoDataAttribute(XUnit)通过CompositeCustomization应用。我选择此路径而不是另一个自定义的原因是为了确保在所有其他自定义之后应用我的后处理器(其中一些自定义用于实际创建实体)。谢谢有趣。听起来这不是你第一次和AF战斗,所以!没错,但我确实喜欢图书馆。总的来说节省了很多时间。这看起来是一个很好的解决方案——比我想的要简单得多:)FWIW,我想支持鲁本·巴特林关于重构成ICustomization的建议。您可以轻松控制排序:这还允许您使用Fixture实例创建传递给
SetId
的值。