如何为 AutoFixture 创建没有 Id 的通用模型?

How to create a Generic Model without Id for AutoFixture?

我正在使用 Autofixture 为我在 XUnit 中的测试自动生成数据。

目前,我有以下自定义方法 - 这是 ICustomization 的实现:

    public void Customize(IFixture fixture)
    {
        fixture.Customize<Product>(composer =>
            composer.Without(e => e.Id));
    }

是否可以使用泛型类型 - 例如代替 Product,我可以在其中传递任何模型?

这应该可以通过使用自定义样本生成器来实现:

public class NoIdSpecimenBuilder : ISpecimenBuilder
    {
        public object Create(object request, ISpecimenContext context)
        {
            var propertyInfo = request as System.Reflection.PropertyInfo;
            if (propertyInfo != null &&
                propertyInfo.Name.Equals("Id"))
            {
                return new OmitSpecimen();
            }

            var fieldInfo = request as System.Reflection.FieldInfo;
            if (fieldInfo != null &&
                fieldInfo.Name.Equals("Id"))
            {
                return new OmitSpecimen();
            }

            return new NoSpecimen();
        }
    }

这将阻止 autofixture 尝试为所有名为“Id”的属性生成一个值。

上面的代码是来自https://thomasardal.com/customizations-for-autofixture-my-new-best-friend/

的稍微编辑的示例

我添加了不仅可以忽略属性,还可以忽略字段的功能。 (如果你确定你总是使用属性而不是字段,你可以删除这部分)

哦,标本生成器是这样添加到自动夹具中的:

fixture.Customizations.Add(new NoIdSpecimenBuilder());