如何使AutoFixture随机地从多个TypeRelays中选择

本文关键字:TypeRelays 选择 何使 AutoFixture 随机 | 更新日期: 2023-09-27 18:13:46

我有一个抽象基类,比如base,和一些派生类,比如D1, D2, D3。

我如何设置自动夹具选择D1, D2, D3中的一个,随机当一个请求的基础进来?

为每个D1,D2,D3添加一个typelay到夹具。自定义似乎使它总是选择第一个添加的

如何使AutoFixture随机地从多个TypeRelays中选择

能够组合下面的代码。如果由于某种原因,其中一个请求失败,它将恢复到指定的默认值,因此应该具有防失败功能。它没有完全使用TypeRelay,但效果基本上是一样的。

public class RandomCustomization<T> : ICustomization
{
    private readonly Type _defaultType;
    private readonly Type[] _types;
    public RandomCustomization(Type defaultType, params Type[] types)
    {
        _defaultType = defaultType;
        _types = types;
    }
    public void Customize(IFixture fixture)
    {
        fixture.Customize<T>(v => v.FromFactory(new RandomFactory(_defaultType, _types)));
    }
}
public class RandomFactory : ISpecimenBuilder
{
    private readonly Type _defaultType;
    private readonly Type[] _types;
    private readonly Random _ran = new Random();
    public RandomFactory(Type defaultType, params Type[] types)
    {
        _defaultType = defaultType;
        _types = defaultType.Concat(types).ToArray();
    }
    public object Create(object request, ISpecimenContext context)
    {
        var which = _types[_ran.Next() % _types.Length];
        var toret = context.Resolve(which);
        if (toret == null || toret is OmitSpecimen)
        {
            toret = context.Resolve(_defaultType);
        }
        return toret;
    }
}