簡體   English   中英

如何在動作過濾器中使用參數驗證對 MVC 控制器進行單元測試?

[英]How to unit test MVC controller with argument validation in action filter?

我們有一個 MVC.NET Core Web API 應用程序,它使用操作過濾器來驗證控制器方法的參數。

對於驗證,我們使用 FluentValidation 框架。 在動作過濾器中,我們找到IValidator<TModel> ,其中TModel是控制器動作的參數,例如:

public async Task<IActionResult> Post([FromBody] TModel model)
{
}

在過濾器的OnActionExecuting(ActionExecutingContext context)我們找到合適的驗證器 ( IValidator<TModel> ),驗證參數 ( context.ActionArguments ),如果驗證失敗,我們通過將驗證結果分配到context.Result短路 - 這意味着執行永遠不會到達控制器。

基本原理類似於將 FluentValidation 連接到 MVC 的 ModelState 驗證管道中,但我們需要一些額外的東西,所以我們手動完成。

我們想對控制器和驗證器進行單元測試。 問題在於對控制器進行單元測試。 在測試設置中,我們實例化控制器並調用其方法之一。 現在在生產環境中,參數將始終得到驗證,並且只有在參數有效時才真正將其傳遞給控制器​​方法。 但是在對控制器進行單元測試時,我們很容易傳遞無效參數並獲得意外行為。

原則上,有沒有辦法解決這個問題? 或者我真的需要確保在測試方法中我將有效參數傳遞給控制器​​?

編輯:

我們還計划進行集成測試(最有可能使用 .NET Core 的 TestServer)以確保管道正常工作。 在這篇文章中,我只想討論有關從單元測試方法傳遞給控制器​​的無效參數的問題。

您需要在 ASP.NET Core 中編寫集成測試,請參閱鏈接: https : //docs.microsoft.com/en-us/aspnet/core/testing/integration-testing?view=aspnetcore-2.0

主要目標:您測試相同的 web api,但它在您的測試中托管。

首先對驗證器進行單元測試,以便明確定義哪些參數有效,哪些無效。

然后,正如您在問題中所建議的那樣,您可以僅采用有效輸入並專注於它們以對控制器進行單元測試。

最后,您可以使用有效和無效參數創建一些集成測試。

我同意Nkosi在評論中所說的,因為required屬性不是由控制器直接使用,而是由框架modelbinder使用來驗證(流暢的驗證也是基於此的),所以單獨調用控制器方法不能單元測試該屬性的存在。 它必須與框架進行集成測試。 但是asp.net核心集成測試框架太重了,它可以測試整個流程,而不僅僅是模型綁定。 我們需要一個模型綁定集成測試框架,運行它可以斷言模型狀態是否有效,而不關心實際的控制器動作結果。 也許我們可以自己寫一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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