您可以創建使用現有EnumGenerator
的自定義Specimen Builder,但會跳過您不需要的值。
public class ExcludeUnknownEnumGenerator : ISpecimenBuilder
{
private readonly EnumGenerator _enumGenerator = new EnumGenerator();
public object Create(object request, ISpecimenContext context)
{
var enumType = request as Type;
if (enumType == null || !enumType.IsEnum)
{
return new NoSpecimen();
}
var namesEnumerator = Enum.GetNames(enumType).GetEnumerator();
while (namesEnumerator.MoveNext())
{
var specimen = _enumGenerator.Create(request, context);
if (specimen.ToString() != "Unknown" &&
specimen.ToString() != "Uninitialized")
{
return specimen;
}
}
throw new ObjectCreationException(
"AutoFixture was unable to create a value for " +
enumType.FullName +
" since it is an enum containing either no values or " +
"ignored values only ('Unknown' and 'Uninitialized'). " +
"Please add at least one valid value to the enum.");
}
}
public enum EnumWithUnknown
{
Known,
Unknown,
Wellknown,
Uninitialized
}
下面的代碼顯示enum
值而不Unknown
和Uninitialized
狀態:在這種標本我爲了不鏈接到任何特定類型enum
有意使用specimen.ToString()
方法
var fixture = new Fixture();
fixture.Customizations.Insert(0, new ExcludeUnknownEnumGenerator());
Console.Out.WriteLine("result = {0}", fixture.Create<EnumWithUnknown>());
Console.Out.WriteLine("result = {0}", fixture.Create<EnumWithUnknown>());
Console.Out.WriteLine("result = {0}", fixture.Create<EnumWithUnknown>());
Console.Out.WriteLine("result = {0}", fixture.Create<EnumWithUnknown>());
*** ConsoleOutput ***
result = Known
result = Wellknown
result = Known
result = Wellknown
豈不裝飾現有的'EnumGenerator'會更容易嗎? –
我在'Create'方法中調用'EnumGenerator'類。當你說'更容易'時,你的意思是縮小Create方法嗎? –
請接受我的道歉;在我寫這個評論之前,我沒有完全閱讀代碼。 –