首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >测试FluentValidation PropertyValidator

测试FluentValidation PropertyValidator
EN

Stack Overflow用户
提问于 2014-06-11 11:26:38
回答 3查看 6.2K关注 0票数 11

是否可以隔离地测试FluentValidation PropertyValidator

我知道我可以测试使用PropertyValidator进行特定错误的Validator,但是如果可能的话,我宁愿只在属性验证器上测试true/false。

这能办到吗?如果是这样的话,是怎么做的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-05 17:28:37

我还想测试我的真实/错误逻辑。遗憾的是,IsValid方法受到保护。我的工作是创建另一个IsValid方法,并将受保护的IsValid调用传递到该方法。

代码语言:javascript
运行
复制
public class MyValidator: PropertyValidator 
{
    public MyValidator(
        string errorMessage = "default Message") : base(errorMessage)
    {
    }

    protected override bool IsValid(PropertyValidatorContext context)
    {
        var stringToValidate = context.PropertyValue as String;
        return IsValid(stringToValidate);
    }

    public bool IsValid(string stringToValidate)
    {
        if (stringToValidate == null)
        {
            return false;
        }

        //testing logic here
        return true;
    }
}
票数 10
EN

Stack Overflow用户

发布于 2015-09-28 22:43:21

我知道这已经有一段时间了,但我做到了以下几点:

自定义Validator:

代码语言:javascript
运行
复制
public class MyValidator : PropertyValidator
{
    public MyValidator ()
        : base("Value must be null or between 0 and 3.")
    {
    }

    protected override bool IsValid(PropertyValidatorContext context)
    {
        if (context.PropertyValue == null)
        {
            return true;
        }

        var value = (decimal)context.PropertyValue;
        return value >= 0m && value <= 3m;
    }
}

测试验证器:

代码语言:javascript
运行
复制
public class TestValidator : InlineValidator<TestObject>
{
    public TestValidator (params Action<TestValidator >[] actions)
    {
        foreach (var action in actions)
        {
            action(this);
        }
    }
}

试验对象:

代码语言:javascript
运行
复制
public class TestObject
{
    public TestObject(decimal? val)
    {
        this.GenericDecimal = val;
    }

    public decimal? GenericDecimal { get; set; }
}

测试:

代码语言:javascript
运行
复制
[Test]
public void TestIt()
{
    var validator = new TestValidator(v => v.RuleFor(obj => obj.GenericDecimal).SetValidator( new MyValidator() ));

    Assert.IsTrue(validator.Validate(new TestObject(null)).IsValid);    
    Assert.IsTrue(validator.Validate(new TestObject(0m)).IsValid);   
    Assert.IsTrue(validator.Validate(new TestObject(3m)).IsValid);   
    Assert.IsFalse(validator.Validate(new TestObject(-1m)).IsValid);   
    Assert.IsFalse(validator.Validate(new TestObject(3.01m)).IsValid);   
}
票数 10
EN

Stack Overflow用户

发布于 2016-05-25 09:27:12

至于FluentValidation的版本6.2,由于使ValidatorSelectors全局可配置:https://github.com/JeremySkinner/FluentValidation/commit/95376c0519da1a06388be91a97fb5062fd4a162e,所以可以构建ValidatorSelectors()参数

在下面的示例中,您将看到如何验证Track的“puic”属性

单元测试:

代码语言:javascript
运行
复制
    public void ExistsInCollectionValidatorTest()
    {
        var track = new Track()
        {
            puic = "p1"
        };

        var sut = new ExistsInCollectionValidator<Track>();

        // Build PropertyValidator.Validate() parameter
        var selector = ValidatorOptions.ValidatorSelectors.DefaultValidatorSelectorFactory();
        var context = new ValidationContext(track, new PropertyChain(), selector);
        var propertyValidatorContext = new PropertyValidatorContext(context, PropertyRule.Create<Track,string>(t => t.puic), "puic");

        var results = sut.Validate(propertyValidatorContext);
        // Assertion..
    }
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24161748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档