gpt4 book ai didi

c# - 防止 Autofixture 填充子集合

转载 作者:太空狗 更新时间:2023-10-29 21:17:55 66 4
gpt4 key购买 nike

我正在使用最新版本的 Autofixture,我想阻止它自动填充子集合。

例如,我有一个具有 List 属性的类 Person。我想要填充所有属性,但列表除外。

我试过使用这个定制:

public class RemoveMultiples : ICustomization
{
public void Customize(IFixture fixture)
{
fixture.Customizations
.OfType<FilteringSpecimenBuilder>()
.Where(x => x.Specification is DictionarySpecification)
.ToList().ForEach(c => fixture.Customizations.Remove(c));
fixture.Customizations
.OfType<FilteringSpecimenBuilder>()
.Where(x => x.Specification is CollectionSpecification)
.ToList().ForEach(c => fixture.Customizations.Remove(c));
fixture.Customizations
.OfType<FilteringSpecimenBuilder>()
.Where(x => x.Specification is HashSetSpecification)
.ToList().ForEach(c => fixture.Customizations.Remove(c));
fixture.Customizations
.OfType<FilteringSpecimenBuilder>()
.Where(x => x.Specification is ListSpecification)
.ToList().ForEach(c => fixture.Customizations.Remove(c));
}
}

但它也阻止我使用 .CreateMany()

编辑:我可以使用 .CreateMany(3) 并且它有效。

有什么设置可以让我只在需要时自动填充收藏吗?

edit2:类人应该是这样的:

[Serializable]
public class Person
{
private ICollection<OtherClass> _otherClasses;
private string _something;
public virtual ICollection<OtherClass> OtherClasses
{
get { return _otherClasses; }
set { _otherClasses = value; }
}
}

请注意,它并不总是一个Collection,有时是IList

注意 2:我刚刚意识到有人还删除了 IEnumerable 的自定义,因此 CreateMany() 没有创建任何东西。

最佳答案

这是一种方法。

首先实现一个 SpecimenBuilder,告诉 AutoFixture 跳过为集合属性赋值:

public class CollectionPropertyOmitter : ISpecimenBuilder
{
public object Create(object request, ISpecimenContext context)
{
var pi = request as PropertyInfo;
if (pi != null
&& pi.PropertyType.IsGenericType
&& pi.PropertyType.GetGenericTypeDefinition() == typeof(ICollection<>))
return new OmitSpecimen();

return new NoSpecimen(request);
}
}

然后将其封装在自定义中:

public class DoNotFillCollectionProperties : ICustomization
{
public void Customize(IFixture fixture)
{
fixture.Customizations.Add(new CollectionPropertyOmitter());
}
}

现在通过了以下测试:

[Fact]
public void CreatePersonWithoutFillingCollectionProperty()
{
var fixture = new Fixture().Customize(new DoNotFillCollectionProperties());
var actual = fixture.Create<Person>();
Assert.Null(actual.OtherClasses);
}

[Fact]
public void CreateManyStillWorks()
{
var fixture = new Fixture().Customize(new DoNotFillCollectionProperties());
var actual = fixture.CreateMany<Person>();
Assert.NotEmpty(actual);
}

[Fact]
public void CreatListStillWorks()
{
var fixture = new Fixture().Customize(new DoNotFillCollectionProperties());
var actual = fixture.Create<List<Person>>();
Assert.NotEmpty(actual);
}

[Fact]
public void CreateCollectionStillWorks()
{
var fixture = new Fixture().Customize(new DoNotFillCollectionProperties());
var actual = fixture.Create<ICollection<Person>>();
Assert.NotEmpty(actual);
}

关于c# - 防止 Autofixture 填充子集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17978607/

66 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com