我想讓AutoFixture使用枚舉的隨機值,只要該枚舉包含在我嘗試創建的類型中。基本上與此https://github.com/AutoFixture/AutoFixture/issues/360相同,但對於枚舉。隨機枚舉生成
我試過以下,但AutoFixture嘗試創建枚舉而不是所請求的類型,並且無法投射它。
public class RandomEnumSequenceGenerator<T> : ISpecimenBuilder where T : struct
{
private static Random _random = new Random();
private Array _values;
public RandomEnumSequenceGenerator()
{
if (!typeof(T).IsEnum)
{
throw new ArgumentException("T must be an enum");
}
_values = Enum.GetValues(typeof(T));
}
public object Create(object request, ISpecimenContext context)
{
var index = _random.Next(0, _values.Length - 1);
return _values.GetValue(index);
}
}
然後我用它在我的BaseUnitTest類這樣
public class BaseUnitTestClass
{
internal static Fixture _fixture = new Fixture();
public BaseUnitTestClass()
{
_fixture.Customizations.Add(new RandomEnumSequenceGenerator<TableType>());
}
我拉下來的源代碼,並注意到它遍歷composedBuilders,只有最後一個(在RandomEnumSequenceGenerator)滿足合同,它會創建一個TableType枚舉值,並嘗試將其轉換爲我試圖創建的實際類,該類會引發異常。
異常消息爲如下
at Ploeh.AutoFixture.SpecimenFactory.Create[T](ISpecimenContext context, T seed) at Ploeh.AutoFixture.SpecimenFactory.Create[T](ISpecimenContext context) at Ploeh.AutoFixture.SpecimenFactory.Create[T](ISpecimenBuilder builder) at UnitTests.Unit.BaseUnitTestClass.GetRandomT in mypath\BaseUnitTestClass.cs:line 49 Result Message: System.InvalidCastException : Unable to cast object of type 'MyNamespace.TableType' to type 'MyNameSpace.AssumptionChangeCriteria'.
AssumptionChangeCriteria具有TableType
類型,是一個枚舉的屬性。
其中GetRandom<T>
如下
return _fixture.Create<T>();
我們可以有例外的細節嗎? – Xiaoy312
你不需要做values.Length - 1 btw,因爲Random.Next()的最大值是非包含的。 –