AutoFixture使用正则表达式规则创建属性

时间:2015-03-30 04:33:09

标签: c# regex autofixture

我最近将this正则表达式模式属性应用于我的类中的一个属性,以便评估有效的网址格式。现在出现的问题是AutoFixture无法创建显示错误的实例

  

“AutoFixture无法从中创建实例   Ploeh.AutoFixture.Kernel.RegularExpressionRequest,很可能是因为   它没有公共构造函数,是抽象的或非公共的类型。“

我尝过了一些像

这样的建议
var contact = _fixture.Build<ContactEntity>()
   .With(c=>c.Customer.Website,
     new SpecimenContext(_fixture)
       .Resolve(new RegularExpressionRequest(Constants.UrlRegex)))
   .Create();

public class WebsiteSpecimenBuilder: ISpecimenBuilder
{
    public object Create(object request,
    ISpecimenContext context)
    {
        var pi = request as PropertyInfo;

        if (pi!=null && pi.PropertyType == typeof(string) 
            && (pi.Name.Equals("Email") || pi.Name.Equals("Website")))
        {
            //tried both of these options
            return (new OmitSpecimen() || "http://www.website.com";
        }

        return new NoSpecimen(request);
    }
}

但我仍然无法通过autofixture来创建课程。我是否遗漏了要创建它的东西,或者这个正则表达式是否太复杂,无法自动处理?

2 个答案:

答案 0 :(得分:5)

我似乎已经通过使用自定义方法获得了解决方案:

_fixture = new Fixture();
_fixture.Customize<CustomerEntity>(ce => 
    ce.With(x => x.Website, "http://suchTest.verwow"));

这将返回调用客户以拥有此网站(或其他正则表达式属性)的任何实例。我真的不知道autofixture中的某些东西是否优先于为什么这个在设置网站时工作,而其他人没有。但它是一个允许我的测试工作的解决方案

答案 1 :(得分:1)

您应该检查传递给RegularExpressionRequest()的正则表达式

new RegularExpressionRequest(Constants.UrlRegex)

正则表达式应为生成类型,而不是验证。例如,可以如下

string TopicSuffixValidation = @"[a-zA-Z0-9]{1,5}/[a-zA-Z0-9]{1,5}"