如何为 AutoFixture 自定义 属性 的正则表达式?
How can I customize a property's regex for AutoFixture?
我刚刚更改了 [RegularExpression]
验证,三分之一的单元测试失败了!
事实证明 AutoFixture 正在根据该正则表达式生成值,这很酷,但它不理解所有正则表达式,所以我想为它提供一个更简单的正则表达式:
Fixtures.Customize<Details>(c => c.With(d => d.PhoneNumber,
new SpecimenContext(Fixtures).Resolve(
new RegularExpressionRequest(@"[2-9]\d{2}-\d{3}-\d{4}"))));
这最终在对象创建时给我一个一般的 LINQ 错误 ("Sequence contains no elements.")。我做错了什么?
或者,有什么方法可以关闭此功能? Customize()
很有用,但它阻止我使用 Build()
而不重复所有相同的逻辑。 (不是吗?)
您无法轻易关闭该功能,但可以轻松覆盖它:
public class Details
{
[RegularExpression(@"?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$")]
public string PhoneNumber { get; set; }
}
public class DetailsTests
{
[Fact]
public void OverridePhoneNumberRegularExpression()
{
var fixture = new Fixture();
var pattern = @"[2-9]\d{2}-\d{3}-\d{4}";
var phoneNumber =
new SpecimenContext(fixture).Resolve(
new RegularExpressionRequest(pattern));
fixture.Customize<Details>(c => c
.With(x => x.PhoneNumber, phoneNumber));
var sut = fixture.Create<Details>();
var actual = sut.PhoneNumber;
Assert.True(Regex.IsMatch(actual, pattern));
}
}
此测试通过并且看起来与问题中显示的测试相似。 – 在 Details
class?
中定义了哪些其他成员
我刚刚更改了 [RegularExpression]
验证,三分之一的单元测试失败了!
事实证明 AutoFixture 正在根据该正则表达式生成值,这很酷,但它不理解所有正则表达式,所以我想为它提供一个更简单的正则表达式:
Fixtures.Customize<Details>(c => c.With(d => d.PhoneNumber,
new SpecimenContext(Fixtures).Resolve(
new RegularExpressionRequest(@"[2-9]\d{2}-\d{3}-\d{4}"))));
这最终在对象创建时给我一个一般的 LINQ 错误 ("Sequence contains no elements.")。我做错了什么?
或者,有什么方法可以关闭此功能? Customize()
很有用,但它阻止我使用 Build()
而不重复所有相同的逻辑。 (不是吗?)
您无法轻易关闭该功能,但可以轻松覆盖它:
public class Details
{
[RegularExpression(@"?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$")]
public string PhoneNumber { get; set; }
}
public class DetailsTests
{
[Fact]
public void OverridePhoneNumberRegularExpression()
{
var fixture = new Fixture();
var pattern = @"[2-9]\d{2}-\d{3}-\d{4}";
var phoneNumber =
new SpecimenContext(fixture).Resolve(
new RegularExpressionRequest(pattern));
fixture.Customize<Details>(c => c
.With(x => x.PhoneNumber, phoneNumber));
var sut = fixture.Create<Details>();
var actual = sut.PhoneNumber;
Assert.True(Regex.IsMatch(actual, pattern));
}
}
此测试通过并且看起来与问题中显示的测试相似。 – 在 Details
class?