我正在使用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
使用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()方法,但这会在任何失败时引发异常。
给出一个看起来像这样的验证器类
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方法签名只接受一个规则集参数,我没有看到任何方法来执行此操作.有"*",但我不想运行所有规则.
请帮忙.
我有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) 我正在构建一个查询管道(使用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实现,因此它可以检查错误并在验证失败时抛出异常.
我正在使用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,因为它总是检查第一次验证失败并停止验证其他验证失败.当授权验证失败时,有没有办法可以返回服务(从调用验证器的位置).
我正在使用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) 如果我有以下规则:
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) 如果其中一个失败,是否有任何方法可以跳过在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#伪代码
如果我有课
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) fluentvalidation ×10
c# ×8
asp.net-mvc ×3
validation ×3
.net ×1
ajax ×1
captcha ×1
fakeiteasy ×1
fluent ×1
knockout.js ×1
servicestack ×1
unit-testing ×1