标签: fluentvalidation

使用FakeItEasy和FluentValidation伪造来自commonlibnet的Captcha

我正在使用commonlibrary中的Captcha类(http://commonlibrarynet.codeplex.com/).我的代码工作和一切,但现在我正在尝试编写单元测试.

我的验证规则是:

 RuleFor(x => x.CaptchaUserInput)
            .NotEmpty()
            .Must((x, captchaUserInput) => Captcha.IsCorrect(captchaUserInput, x.CaptchaGeneratedText))
            .WithMessage("Invalid captcha code");
Run Code Online (Sandbox Code Playgroud)

在我的设置代码中,我尝试执行以下操作:

A.CallTo(() => Captcha.IsCorrect()).Returns(true);
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误消息:

SetUp : FakeItEasy.Configuration.FakeConfigurationException : 

The current proxy generator can not intercept the specified method for the following reason:
- Static methods can not be intercepted.


at FakeItEasy.Configuration.DefaultInterceptionAsserter.AssertThatMethodCanBeInterceptedOnInstance(Metho    dInfo method, Object callTarget)
at FakeItEasy.Configuration.FakeConfigurationManager.CallTo(Expression`1 callSpecification)
at ProdMaster.Hosts.Web.Tests.Unit.Controllers.AccountControllerTests.SetUp() in     AccountControllerTests.cs: line 44 
Run Code Online (Sandbox Code Playgroud)

所以问题实际上是如何使用FakeItEasy伪造静态方法.

TIA,

大卫

captcha unit-testing common-library fluentvalidation fakeiteasy

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

单个FluentValidation规则失败时引发异常

使用FluentValidation,是否可能在单个规则失败时引发异常?例如,我想调用Validate(),使下面的第一个规则简单地验证,但是第二个规则如果为false则抛出异常。

RuleFor(x => x.Title)
    .NotEmpty()
    .WithMessage("Please add a title for the project");

RuleFor(x => x.UserId)
    .NotEmpty()
    .WithMessage("User not supplied");
Run Code Online (Sandbox Code Playgroud)

我可能正在试图迫使FluentValidation做一些它不打算做的事情。而且我知道ValidateAndThrow()方法,但这会在任何失败时引发异常。

.net c# fluentvalidation

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

Fluent验证规则,子集和嵌套

给出一个看起来像这样的验证器类

 public class SomeValidator : AbstractValidator<SomeObject>
 {
      public SomeValidator(){
           RuleSet("First",
                () => {
                     RuleFor(so => so.SomeMember).SetValidator(new SomeMemberValidator())
           });
           RuleSet("Second",
                () => ... Code Does Not Matter ... );
           RuleSet("Third",
                () => ... Code Does Not Matter ... );
      }
 }
Run Code Online (Sandbox Code Playgroud)

另一个做内部成员验证

 public class SomeMemberValidator: AbstractValidator<SomeMember>
 {
      public SomeValidator(){
           RuleSet("Fourth",
                () => {
                     ... Code Does Not Matter ...
           });
      }
 }
Run Code Online (Sandbox Code Playgroud)

问题是,我想运行特定的规则集:"First","Second"和"Fourth".我不希望"第三"运行.

鉴于Validate方法签名只接受一个规则集参数,我没有看到任何方法来执行此操作.有"*",但我不想运行所有规则.

请帮忙.

c# validation asp.net-mvc fluentvalidation

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

使用带有kendo + knockout的Ajax Asp Mvc3提交服务器验证时不会触发

我有Asp Mvc3应用程序.在我看来,我正在使用kendoui + knockoutjs.我正在使用kendo验证器处理客户端验证.我是asp mvc3的新手,我不能让我的服务器端验证工作.

这是我的业务对象:

[Validator(typeof(FranchiseInfoValidator))]
    public class FranchiseInfo
    {
        public string FullName { get; set; }
        public string ShortName { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用FluentValidation.这是我的验证规则的实现:

public class FranchiseInfoValidator : AbstractValidator<FranchiseInfo>
    {
        public FranchiseInfoValidator()
        {
            RuleFor(franchiseInfo => franchiseInfo.FullName).NotEmpty();
            RuleFor(franchiseInfo => franchiseInfo.ShortName).NotEmpty();
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是我的视图模型:

public class FranchiseInfoViewModel
    {
        public string FullName { get; set; }
        public string ShortName { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

这是我对FranchiseInfoViewModel强烈输入的视图:

@model MvcApplication2.Models.FranchiseInfoViewModel

<script src="../../Scripts/Details.js" type="text/javascript"></script>

<form id="franchiseForm" action="" style="font-family: Trebuchet MS, Verdana, Helvetica, Sans-Serif;"> …
Run Code Online (Sandbox Code Playgroud)

ajax fluentvalidation asp.net-mvc-3 knockout.js

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

简单注射器和流畅验证的通用协方差

我正在构建一个查询管道(使用IQueryHandler的装饰器模式),其中,在实际执行查询之前,处理了许多横切关注点.其中一个问题是验证,我正在使用Fluent验证库.

Simple Injector是IoC容器的首选,我使用它来使用通用的逆变和以下注册来注册每个IQueryValidationHandler:

container.RegisterManyForOpenGeneric(typeof(IQueryValidationHandler<>), container.RegisterAll, _assemblies);
Run Code Online (Sandbox Code Playgroud)

这非常适合解决以下实现:

public class QueryValidationHandler : IQueryValidationHandler<IQuery>{ }
Run Code Online (Sandbox Code Playgroud)

该类中可用的查询是一种具体的IQuery类型.但是,当我尝试将基于IQuery的IValidator(通过构造函数注入)注入QueryValidationHandler时,使用以下代码和注册:

码:

public class QueryValidationHandler : IQueryValidationHandler<IQuery>
{
    private IValidator< IQuery > _validator;

    public QueryValidationHandler(IValidator<IQuery> validator)
    {
        _validator = validator;
    }
Run Code Online (Sandbox Code Playgroud)

注册:

container.RegisterManyForOpenGeneric(typeof (IValidator<>), container.RegisterAll, _assemblies);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

QueryValidationHandler类型的构造函数包含IValidator <IQuery>类型的参数,其名称为"validator",未注册.请确保在容器中注册了IValidator <IQuery>,或者更改了QueryValidationHandler的构造函数.

有没有办法为注入QueryValidationHandler的具体类型的IQuery获取IValidator的实现?

更新

在史蒂文的出色回答之后,我仍然陷入困境(同样的例外).很可能是因为我试图将Fluent Validators AbstractValidator <T>的实现注册为IValidator <T>.在之前的项目中,我能够进行以下注册:

container.RegisterManyForOpenGeneric(typeof(IValidator<>), typeof(FindProductsForCompanyQuery).Assembly);
Run Code Online (Sandbox Code Playgroud)

对于以下实现:

public class FindProductsForCompanyQueryValidator : AbstractValidator<FindProductsForCompanyQuery>
{
    public FindProductsForCompanyQueryValidator()
    {
        RuleFor(q => q.CompanyId).NotNull();
    }
}
Run Code Online (Sandbox Code Playgroud)

上面提到的QueryValidationHandler应该注入程序集中的所有AbstractValidator实现,因此它可以检查错误并在验证失败时抛出异常.

c# contravariance fluentvalidation simple-injector

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

Fluent验证 - 在特定验证失败时停止验证所有其他验证

我正在使用Fluent Validation进行服务器端验证.我已经创建了一组将被验证的规则.所有这些规则都是我的验证器中的单个函数.

 public SampleValidator()
{
            Validate_Authorisation();
            ValidateTitle_NotEmpty();
            ValidateGender_NotEmpty();
            ValidateFirstName_Regex();
            ValidateFirstName_NotEmpty();
            ValidateSurname_NotEmpty();
            ValidateSurname_Regex();
            ValidateMobilePhone_Regex();
}

private void Validate_Authorisation()
        {
            RuleFor(Model=> Model)
                .Must(Model=> IsUserAuthorised(UserName))
                .WithName("Authorisation Check");
        }

 private void ValidateTitle_NotEmpty()
        {
            RuleFor(model=> model)
            .Must(title=> !string.IsNullOrEmpty(title))
            .WithName("Title");
             }
        private void ValidateGender_NotEmpty()
        {
            RuleFor(model=> model)
              .Must(Gender=> !string.IsNullOrEmpty(Gender))
               .WithName("Gender");
        }.... And others
Run Code Online (Sandbox Code Playgroud)

现在,我想在授权验证失败时停止验证所有其他验证.我不想使用CascadeMode.StopOnFirstFailure,因为它总是检查第一次验证失败并停止验证其他验证失败.当授权验证失败时,有没有办法可以返回服务(从调用验证器的位置).

c# validation asp.net-mvc fluentvalidation

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

FluentValidation一个属性的多个错误消息

我正在使用FluentValidation验证输入值.我正在使用一种方法来验证数据库中的值,该值返回整数值-1,-2和-3,用于基于值的不同错误消息.如何根据方法的返回值显示错误消息.我在类范围内创建了一个变量并设置了返回值,并在下一个语句中尝试比较并尝试显示消息,但我观察到在更新值之前执行了下一个语句.

我想为一个输入值显示不同的错误消息.

例如,用户输入负值错误消息应该是"不允许负值",如果用户输入一个大值编号,那么消息应该是"数字太长".

这里是代码 ISValidAction是验证输入并设置变量returnvalue的方法,此方法始终返回true.

int returnvalue = 0;
RuleFor(r => r.action).Must(ISValidAction).WithMessage("Action does not exist in the system.").When(r => !String.IsNullOrEmpty(r.action));

RuleFor(r => returnvalue).Must(r => !(returnvalue != 1 && returnvalue != -2 && returnvalue != -3)).WithMessage("");//for -1
        RuleFor(r => returnvalue).Must(r => !(returnvalue != 1 && returnvalue != -1 && returnvalue != -3)).WithMessage("");//for -2
        RuleFor(r => returnvalue).Must(r => !(returnvalue != 1 && returnvalue != -1 && returnvalue != -2)).WithMessage("");// for -3
Run Code Online (Sandbox Code Playgroud)

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

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

如何在一个规则中添加多个IF条件?

如果我有以下规则:

if (a == true && b == 0)
   return errorsenum.somerror1;
else if (b < c)
   return errorsenum.somerror2;
Run Code Online (Sandbox Code Playgroud)

如何将上述实现为FluentValidation规则?

编辑:

这两条规则有效吗?

RuleFor(x => x.b).GreaterThan(0).When(x => x.a);
RuleFor(x => x.b).GreaterThanOrEqualTo(x => x.c);
Run Code Online (Sandbox Code Playgroud)

c# fluentvalidation

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

如果其中一个失败,则跳过Fluent验证规则集中的执行其他验证规则

如果其中一个失败,是否有任何方法可以跳过在Ruleset中执行验证规则.

我的API端点有以下规则

param1,param2,param3

RuleSet  => 
     RuleFor(req => req.param1).NotEmpty().WithMessage("param1 is missing.");
     RuleFor(req => req.param2).NotEmpty().WithMessage("param2 is missing.");
     RuleFor(req => req.param3).NotEmpty().WithMessage("param3 is missing.");
     RuleFor(req => req.param1).Must((req, param1) => IsValidRequest(req)).WithMessage("Invalid request.");
Run Code Online (Sandbox Code Playgroud)

在我的IsValidRequest(req)中,我再次必须在进行自定义验证之前验证param1,param2,param3,即使上述规则失败,所有其他验证仍将继续尝试.

c# validation fluent fluentvalidation servicestack

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

我可以在流利的验证器中使用验证器吗

C#伪代码

如果我有课

class Person
{
  string Name
  date DOB
  Address address
}
Run Code Online (Sandbox Code Playgroud)

我可以让PersonValidator验证Person

但是由于Address是一种复杂的类型,有时我想分别对其进行验证,所以我有一个PersonValidator和一个AddressValidator。问题是,如何在PersonValidator中使用AddressValidator?

class PersonValidator : AbstractValidator<Person>
{
   PersonValidator()
   {
       RuleFor(c => c.Name).NotEmpty();

       var addressValidator = new AddressValidator();
       addressValidator.Validate( person.address ) // ???
    }
}
Run Code Online (Sandbox Code Playgroud)

c# fluentvalidation

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