我有一组嵌套相当深的数据访问类。

要构建其中的5个列表,AutoFixture需要2分钟以上的时间。每个单元测试需要2分钟才能完成。

如果我是手工编写代码,那么我只会编写所需的代码,这样可以更快地进行初始化。有没有一种方法可以告诉AutoFixture仅执行某些属性,以便它不会花时间在我不需要的结构区域上?

例如:

public class OfficeBuilding
{
   public List<Office> Offices {get; set;}
}

public class Office
{
   public List<PhoneBook> YellowPages {get; set;}
   public List<PhoneBook> WhitePages {get; set;}
}

public class PhoneBook
{
    public List<Person> AllContacts {get; set;}
    public List<Person> LocalContacts {get; set;}
}

public class Person
{
   public int ID { get; set; }
   public string FirstName { get; set;}
   public string LastName { get; set;}
   public DateTime DateOfBirth { get; set; }
   public char Gender { get; set; }
   public List<Address> Addresses {get; set;}
}

public class Addresses
{
   public string Address1 { get; set; }
   public string Address2 { get; set; }
}

是否可以告诉AutoFixture为OfficeBuilding.Offices.YellowPages.LocalContacts创建值,但不打扰OfficeBuilding.Offices.YellowPages.AllContacts

最佳答案

一种选择是创建一个自定义,该自定义忽略特定名称的属性:

internal class PropertyNameOmitter : ISpecimenBuilder
{
    private readonly IEnumerable<string> names;

    internal PropertyNameOmitter(params string[] names)
    {
        this.names = names;
    }

    public object Create(object request, ISpecimenContext context)
    {
        var propInfo = request as PropertyInfo;
        if (propInfo != null && names.Contains(propInfo.Name))
            return new OmitSpecimen();

        return new NoSpecimen(request);
    }
}

您可以按以下方式使用它:
var fixture = new Fixture();
fixture.Customizations.Add(
    new PropertyNameOmitter("AllContacts"));

var sut = fixture.Create<OfficeBuilding>();
// -> The 'AllContacts' property should be omitted now.

也可以看看:
  • Omit properties by type
  • Omit properties by namespace
  • 关于c# - 如何指示AutoFixture不要麻烦填写某些属性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18346803/

    10-12 22:13