自定义AutoFixture以创建特定的类型

本文关键字:类型 创建 AutoFixture 自定义 | 更新日期: 2023-09-27 18:11:52

我想为NLog的LogLevel类型创建自定义。实例可以通过FromOrdinal静态方法创建。

我想限制用于创建的序数范围(0..5)。请注意,我不想用生成器定制整个fixture(因为其他整数可能更大)。

下面是我尝试使用的一段代码:

class NLogCustomization : ICustomization
    {
        public void Customize(IFixture fixture)
        {
            fixture.Customize<NLog.LogLevel>(
                c => c.FromFactory(() =>
                    {
                        var ordinal = this.nlogOrdinalLevelFactory.Create<int>(); //Throws invalid cast exception
                        return NLog.LogLevel.FromOrdinal((int)ordinal);
                    }));
        }
        private readonly ISpecimenBuilder nlogOrdinalLevelFactory = new RandomNumericSequenceGenerator(0,5);
    }
不幸的是,上面的代码抛出了InvalidCastException。我在这里做错了什么?

我使用的是3.19.1版本

自定义AutoFixture以创建特定的类型

要直接使用RandomNumericSequenceGenerator和任何其他ISpecimenBuilder,请使用ISpecimenBuilder接口:

object Create(object request, ISpecimenContext context);

在这个例子中,代替Create<T>做:

fixture.Customize<LogLevel>(c => c.FromFactory(() =>
{
    var ordinal = this.nlogOrdinalLevelFactory
        .Create(typeof(int), new SpecimenContext(fixture));
    return NLog.LogLevel.FromOrdinal((int)ordinal);
}));