首页 > 解决方案 > 如何为 AutoFixture 创建没有 ID 的通用模型?

问题描述

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

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

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

是否有可能像通用类型一样 - 例如代替产品,我可以在其中传递任何模型?

标签: c#autofixture

解决方案


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

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());

推荐阅读