簡體   English   中英

使用 FluentValidation 如何在 controller 中使用 validationContext 進行測試

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM