[英]How do I test ActionFilterAttributes that work with ModelState?
正如(其中包括)Kazi Manzur Rashid在這篇博客文章中所建議的那樣,我在使用ActionFilterAttributes
在重定向時將模型狀態從一個請求轉移到另一個請求。
但是,我發現自己無法編寫測試這些屬性行為的單元測試。 舉個例子,這就是我想要ImportModelStateAttribute
的測試:
filterContext
以便TempData[myKey]
包含一些虛假的“導出” ModelState
(也就是我自己創建的ModelStateDictionary
,並添加一個錯誤) ModelState
包含一個模型錯誤。 OnActionExecuting
。 ModelState
現在包含兩個錯誤。 我已經邁出了第一步。
編輯:
是的,我已經嘗試用Moq模擬ActionFilterAttribute
,但是我收到錯誤說明
不可覆蓋的成員上的設置無效
對於TempData
和ModelState
。
Tomas,您不必模擬filterContext,您可以創建用於測試動作過濾器的真實對象,同樣適用於模型狀態,這些是poco對象。 只有你必須模擬的是HttpContext(如果需要)。
[Fact]
public void Should_import_complete_view_data()
{
var attribute = new ImportViewDataFromTempDataAttribute();
var httpContext = new Mock<HttpContextBase>();
var requestContext = new RequestContext(httpContext.Object, new RouteData());
var previousModel = new object();
var previousViewData = new ViewDataDictionary(previousModel) {{"foo", "bar"}};
previousViewData.ModelState.AddModelError("foo", "bar");
var controller = new Mock<ControllerBase>();
controller.Object.ViewData = new ViewDataDictionary();
controller.Object.TempData = new TempDataDictionary { { attribute.Key, previousViewData } };
var controllerContext = new ControllerContext(requestContext, controller.Object);
var actionContext = new ActionExecutingContext(controllerContext, new Mock<ActionDescriptor>().Object, new Dictionary<string, object>());
attribute.OnActionExecuting(actionContext);
Assert.True(actionContext.Controller.ViewData.ContainsKey("foo"));
Assert.True(actionContext.Controller.ViewData.ModelState.ContainsKey("foo"));
Assert.Same(previousModel, actionContext.Controller.ViewData.Model);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.