标签: fluentvalidation

如何将单元测试添加到我的流畅验证类中?

我有 ac# 模型类 (Address.cs),看起来像这样......

namespace myProject.Models
{
    [Validator(typeof(AddressValidator))]
    public class Address
    {
        public string AddressLine1 { get; set; }
        public string PostCode { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个验证器类(AddressValidator.cs),看起来像这样......

namespace myProject.Validation
{
    public class AddressValidator : AbstractValidator<Address>
    {
        public AddressValidator()
        {
            RuleFor(x => x.PostCode).NotEmpty().WithMessage("The Postcode is required");
            RuleFor(x => x.AddressLine1).MaximumLength(40).WithMessage("The first line of the address must be {MaxLength} characters or less");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何为我的验证器类添加单元测试,以便我可以测试“地址行 1”最多占用 40 个字符?

c# unit-testing fluentvalidation

2
推荐指数
1
解决办法
7948
查看次数

FluentValidation:将值与值的聚合进行比较?

当我为单个类的属性制定简单规则时,我发现 FluentValidation 很简单,但是一旦我需要比较集合中的值(例如属性List<T>),它就会变得非常棘手。假设以下两个最小类:

public class PurchaseOrder
{
    public List<LineItem> LineItems { get; set; }
    public decimal Total { get; set; }

    public PurchaseOrder()
    {
        LineItems = new List<LineItem>();
    }
}

public class LineItem
{
    public decimal Price { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

还有这个类:

class Program
{
    static void Main(string[] args)
    {
        PurchaseOrder order = new PurchaseOrder();
        order.LineItems.Add(new LineItem() { Price = 12m });
        order.LineItems.Add(new LineItem() { Price = 14m });
        order.Total = 26m;

        PurchaseOrderValidator validator = new PurchaseOrderValidator(); …
Run Code Online (Sandbox Code Playgroud)

c# fluentvalidation

2
推荐指数
2
解决办法
2123
查看次数

当另一个属性为 true 时流畅的验证器

我正在尝试使用 FluentValidation 来验证属性“用户名”是否另一个属性“找到”为 true。

Object Contains:
   string Username
   bool Found

RuleFor(x => x.Username)
    .NotEmpty().DependentRules(() => {
                RuleFor(y => y.Found).Equals(true); //Not valid syntax
            })
    .WithMessage("Not Found");
Run Code Online (Sandbox Code Playgroud)

不幸的是,似乎没有简单的方法可以做到这一点?

fluentvalidation

2
推荐指数
1
解决办法
2784
查看次数

FluentValidation IRuleBuilderOptions 扩展方法 - 仅在值存在时运行正则表达式验证器

我有以下 FluentValidation 扩展方法来验证电话号码:

public static IRuleBuilderOptions<T, string> MatchPhoneNumber<T>(this IRuleBuilder<T, string> rule)
    => rule.Matches(@"^(1-)?\d{3}-\d{3}-\d{4}$").WithMessage("Invalid phone number");
Run Code Online (Sandbox Code Playgroud)

我称之为:

RuleFor(contact => contact.PhoneNumber).MatchPhoneNumber()
Run Code Online (Sandbox Code Playgroud)

但是,我只希望扩展方法在电话号码字符串不为空/空时验证电话号码。我可以通过执行以下操作来做到这一点:

RuleFor(contact => contact.PhoneNumber)
    .MatchPhoneNumber()
    .When(contact => !string.IsNullOrEmpty(contact.PhoneNumber));
Run Code Online (Sandbox Code Playgroud)

但有没有办法可以在扩展方法本身中做到这一点?

c# fluentvalidation

2
推荐指数
1
解决办法
3905
查看次数

ASP.NET Core Web API - FluentValidationMvcExtensions.AddFluentValidation(IMvcBuilder, Action&lt;FluentValidationMvcConfiguration&gt;)' 已过时

在 ASP.NET Core-6 Web API 中,我使用 FluentValidation.AspNetCore(11.2.1)。

我在 Program.cs 中有这段代码:

builder.Services.AddMvc().AddFluentValidation(fv => {
    fv.DisableDataAnnotationsValidation = true;
    fv.RegisterValidatorsFromAssembly(typeof(Program).Assembly);
    fv.RegisterValidatorsFromAssembly(Assembly.GetExecutingAssembly());
    fv.ImplicitlyValidateChildProperties = true;
    fv.ImplicitlyValidateRootCollectionElements = true;
    fv.AutomaticValidationEnabled = true;
});
Run Code Online (Sandbox Code Playgroud)

但我得到了这个错误,上面的所有代码都突出显示:

FluentValidationMvcExtensions.AddFluentValidation(IMvcBuilder, Action)' 已过时:'不推荐调用 AddFluentValidation()

我该如何解决这个问题?

谢谢

c# fluentvalidation asp.net-web-api asp.net-core

2
推荐指数
1
解决办法
8712
查看次数

传递Lambda表达式而不是Object的优点

我一直在审查FluentValidation哪个是一个很好的验证库,但我注意到它们传入LambdaExpression而不是对象属性,我想了解这种用法​​的优点:

using FluentValidation;

public class CustomerValidator: AbstractValidator<Customer> {
  public CustomerValidator() {
    RuleFor(customer => customer.Surname).NotEmpty();
    RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name");
    RuleFor(customer => customer.Company).NotNull();
    RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
    RuleFor(customer => customer.Address).Length(20, 250);
    RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
  }

  private bool BeAValidPostcode(string postcode) {
    // custom postcode validating logic goes here
  }
}

Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customer);

bool validationSucceeded = results.IsValid;
IList<ValidationFailure> failures = …
Run Code Online (Sandbox Code Playgroud)

c# lambda fluentvalidation

1
推荐指数
1
解决办法
591
查看次数

使用Fluent验证来验证输入字符串的某些部分

我正在使用ASP.NET 4Fluent Validation

我正在尝试设置一个规则来检查我的用户名是否以“ adm”开头。

我有以下内容,给我错误。我尝试关注在线示例,但无法正常工作:

RuleFor(x => x.UserName)
     .NotNull()
     .WithMessage("Required")
     .Must(x => x.UserName.StartsWith("adm"))
     .WithMessage("Must start with ADM");
Run Code Online (Sandbox Code Playgroud)

我认为我做的不正确吗?

我尝试了以下活动:

.Must(x => x.UserName.Substring(0, 3) == "adm")
Run Code Online (Sandbox Code Playgroud)

两者均出现错误:

Delegate 'System.Func<MyProject.ViewModels.LogOnViewModel,string,bool>' does not take 1 arguments
Run Code Online (Sandbox Code Playgroud)

c# asp.net fluentvalidation asp.net-mvc-3 asp.net-mvc-4

1
推荐指数
1
解决办法
1799
查看次数

FluentValidation:如何将bool作为必填字段,将'false'作为有效输入?

public bool IsDefault { get; set; }

RuleFor(stockImage => stockImage.IsDefault).NotNull();

我有这个规则,IsDefaultboolean属性不应该为null.问题是当客户端在命中api时没有传递此字段,IsDefault将默认布尔属性设置为false并且不提供任何错误,例如"此字段是必需的".

如何根据需要将此字段设为"true"或"false"作为其唯一有效输入?

我试过的一个解决方案就是:

RuleFor(stockImage => stockImage.IsDefault).NotEmpty();

这个问题是它在IsDefault"假" 时给出验证错误,这不是预期的用例.

c# fluentvalidation

1
推荐指数
2
解决办法
4313
查看次数

fluentvalidation错误消息包含c#属性名称,而不包含客户端json属性名称?

我有一个C#WebApi项目,并且正在使用FluentValidation.WebApi包来验证客户端输入。

下面是我的模型类代码,它具有名为“ IsPremium”的C#属性。对于所有客户端,此属性均具有json名称“ isLuxury”。

[Serializable, JsonObject, Validator(typeof(ProductValidator))]
public class Product
{
    [JsonProperty("isLuxury")]
    public bool? IsPremium { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的验证器类如下所示:

public class ProductValidator : AbstractValidator<Product>
    {
        public ProductValidator()
        {
            RuleFor(product => product.isPremium).NotNull();
        }
    }
Run Code Online (Sandbox Code Playgroud)

所以对于这样的请求: http:// localhost:52664 / api / product

请求正文:{“ isLuxury”:“”}

我收到以下错误:

{
  "Message": "The request is invalid.",
  "ModelState": {
    "product.isPremium": [
      "'is Premium' must not be empty."
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

流利的选择了C#属性名称,这对客户端没有意义,因为它知道它是“ isLuxury”。如何强制Fluent从json属性而不是c#属性中选择名称,以提供更好的验证,例如“'isLuxury'不能为空。”?

如果不可能的话,我将不得不重命名我所有的C#属性,使其具有与公开给所有客户端的json相同的名称。请提出您是否还有其他更好的方法来解决此问题。

c# json fluentvalidation asp.net-web-api

1
推荐指数
1
解决办法
2620
查看次数

如何让我的NancyFX单元测试运行我的验证?

我正在使用NancyFX和FluentValidation,如https://github.com/NancyFx/Nancy/wiki/Nancy-and-Validation所述.我的网络应用程序运行正常,验证工作正常,但当我尝试对任何使用验证的模块进行单元测试时,我收到错误

Nancy.Validation.ModelValidationException : No model validator factory could be located.
Please ensure that you have an appropriate validation package installed, such as 
one of the Nancy.Validation packages.
Run Code Online (Sandbox Code Playgroud)

我已经验证我的单元测试项目引用了 Nancy.Validation.FluentValidationFluentValidation程序集.

我的测试代码如下所示:

public class ArticleModuleTests {
    private Browser browser;
    private IDatabase db;

    const int USER_ID = 123;
    const int ARTICLE_ID = 456;

    [SetUp]
    public void SetUp() {
        var user = new User { Username = "test", Id = USER_ID };
        db = A.Fake<IDatabase>();
        browser = new Browser(with …
Run Code Online (Sandbox Code Playgroud)

unit-testing fluentvalidation nancy

1
推荐指数
1
解决办法
333
查看次数