【发布时间】:2021-11-19 15:45:40
【问题描述】:
我设置了一个验证器,它需要使用正在验证的视图模型之外的值。所以要做到这一点,我使用 ValidationContext 并分配 RootContextData,然后在控制器中调用 validate 方法,如果它返回错误,我将它添加到模型状态。这一切都很好,但我不知道如何测试它,或者这可能表明我没有以最好的方式完成它。
例如验证者:
RuleFor(x => x.StartDate.Date.Day)
.Custom((day, context) =>
{
if (!context.RootContextData.TryGetValue("TargetDate", out var targetDate)) return;
var dateVm = context.InstanceToValidate;
if (DatesHelper.SourceDateStringIsGreaterThanTargetDateString(
dateVm.StartDate.DateInputAsString(),
targetDate as string) == true)
{
context.AddFailure("The Start date must be on or before the target date for the action");
}
});
然后在控制器中..
. . .
var repositoryResult = customerRepo.Result;
if (!ModelState.IsValid)
{
return View(vm);
}
var validationContext = new ValidationContext<StartDateViewModel>(vm)
{
RootContextData =
{
["TargetDate"] = repositoryResult.Dates.Target
}
};
var validator = new StartDateValidator();
var validationResult = await validator.ValidateAsync(validationContext);
if (!validationResult.IsValid)
{
ModelState.AddModelError("StartDate.Date.Day", validationResult.Errors.First().ErrorMessage);
return View(vm);
}
. . .
显然,我可以只传入一个带有错误日期的视图模型,这会标记这一点,但感觉就像我正在测试控制器中的验证器。我真正想做的(我认为)是传递一个具有任意日期的视图模型,让验证器在该规则上失败,然后断言错误已添加到模型状态。任何帮助表示赞赏。
-珍妮
【问题讨论】:
标签: c# asp.net-core fluentvalidation