【问题标题】:How to create a Generic Model without Id for AutoFixture?如何为 AutoFixture 创建没有 ID 的通用模型?
【发布时间】:2020-10-13 15:32:08
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# autofixture


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 2012-12-12
      • 2013-07-19
      相关资源
      最近更新 更多