這是其中之一AutoFixture在你的對象模型的可用性方面給你反饋的情況。
如果EmailAddresses
屬性應該只包含有效的電子郵件地址,那麼您應該問自己,將它們表示爲通用字符串是the right choice。類似MailAddress
類的更具體類型將限制該屬性的有效值集。 由於AutoFixture知道如何創建MailAddress
的實例,因此它還可以更輕鬆地爲其生成測試數據。
話雖如此,如果它是不可行的,你要改變的對象模型,你仍然可以寫一個customization告訴AutoFixture提供IEnumerable<string>
類型的任何屬性或參數有效的電子郵件地址與email
在他們的名字的地方:
public class EmailAddressStringsGenerator : ISpecimenBuilder
{
public object Create(object request, ISpecimenContext context)
{
if (IsEnumerableOfStringPropertyOrParameterNamedEmail(request))
{
return CreateManyEmailAddresses(context);
}
return new NoSpecimen();
}
static bool IsEnumerableOfStringPropertyOrParameterNamedEmail(object request)
{
return IsEnumerableOfStringPropertyNamedEmail(request) ||
IsEnumerableOfStringParameterNamedEmail(request);
}
static bool IsEnumerableOfStringPropertyNamedEmail(object request)
{
var property = request as PropertyInfo;
return property != null &&
property.Name.ContainsIgnoringCase("email") &&
typeof(IEnumerable<string>).IsAssignableFrom(property.PropertyType);
}
static bool IsEnumerableOfStringParameterNamedEmail(object request)
{
var parameter = request as ParameterInfo;
return parameter != null &&
parameter.Name.ContainsIgnoringCase("email") &&
typeof(IEnumerable<string>).IsAssignableFrom(parameter.ParameterType);
}
static IEnumerable<string> CreateManyEmailAddresses(ISpecimenContext context)
{
var addresses = (IEnumerable<MailAddress>)
context.Resolve(typeof(IEnumerable<MailAddress>));
return addresses.Select(a => a.Address);
}
}
您可以將它添加到Customizations
屬性,然後使用在Fixture
是定製:
fixture.Customizations.Insert(0, new EmailAddressStringsGenerator());
你不想'選擇(X => x.Address)'? ToString在一個郵件地址上產生''ecfd3086-48c7-4999-8b5e-c19f9d0875ff「<[email protected]>'' –