Ich möchte, dass AutoFixture einen zufälligen Wert einer Aufzählung verwendet, wenn diese Aufzählung in einem Typ enthalten ist, den ich erstellen möchte. Grundsätzlich das gleiche wie dieses https://github.com/AutoFixture/AutoFixture/issues/360 aber für enums.Zufallsgenerierung
Ich habe Folgendes versucht, aber AutoFixture versucht, die enum anstelle des angeforderten Typs zu erstellen und kann es nicht umwandeln.
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);
}
}
ich dann verwenden, in meiner BaseUnitTest Klasse wie diese
public class BaseUnitTestClass
{
internal static Fixture _fixture = new Fixture();
public BaseUnitTestClass()
{
_fixture.Customizations.Add(new RandomEnumSequenceGenerator<TableType>());
}
ich den Quellcode nach unten gezogen und festgestellt, dass es den composedBuilders und nur der letzten Schleife durch (der RandomEnumSequenceGenerator) erfüllt den Vertrag Es erstellt dann einen TableType-Enumerationswert und versucht, es als die tatsächliche Klasse, die ich erstellen möchte, zu werfen, die eine Ausnahme auslöst.
Die Ausnahmemeldung ist wie folgt:
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 eine Eigenschaft vom Typ hat, die eine ENUM TableType
ist.
wo GetRandom<T>
ist wie folgt
return _fixture.Create<T>();
Können wir das Detail der Ausnahme haben? – Xiaoy312
Sie müssen keine Werte machen. Länge - 1 Btw, weil der Maximalwert für Random.Next() nicht inklusive ist. –