[英]With FluentValidation how can I test using validationContext within a controller
我有一個驗證器設置需要使用正在驗證的視圖模型之外的值。 為此,我使用 ValidationContext 並分配 RootContextData,然后在 controller 中調用 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");
}
});
然后在 controller..
. . .
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);
}
. . .
顯然,我可以只傳入一個視圖 model 並帶有不正確的日期,這將標記這一點,但感覺就像我正在測試 controller 中的驗證器。我真正想做的(我認為)是通過任意的視圖模型日期,讓驗證器在該規則上失敗,然后斷言錯誤已添加到模型狀態。 任何幫助表示贊賞。
-珍妮
我認為您可以做的是測試 Controller 邏輯。 一個例子可能是這樣的:
[Test]
public void IndexPost_AddModelStateError_WhenInvalidData()
{
var controller = new HomeController();
var vm = ... //Test Data
var result = controller.Index(vm) as ViewResult;
Assert.IsTrue(result.ViewData.ModelState["StartDate.Date.Day"].Errors.Any());
}
在這里您可以找到有關測試 controller 邏輯的 Microsoft 文檔
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.