簡體   English   中英

如何測試與ModelState一起使用的ActionFilterAttributes?

[英]How do I test ActionFilterAttributes that work with ModelState?

正如(其中包括)Kazi Manzur Ra​​shid在這篇博客文章中所建議的那樣,我在使用ActionFilterAttributes在重定向時將模型狀態從一個請求轉移到另一個請求。

但是,我發現自己無法編寫測試這些屬性行為的單元測試。 舉個例子,這就是我想要ImportModelStateAttribute的測試:

  1. 設置filterContext以便TempData[myKey]包含一些虛假的“導出” ModelState (也就是我自己創建的ModelStateDictionary ,並添加一個錯誤)
  2. 使ModelState包含一個模型錯誤。
  3. 調用OnActionExecuting
  4. 驗證兩個詞典是否已合並, ModelState現在包含兩個錯誤。

我已經邁出了第一步。

編輯:
是的,我已經嘗試用Moq模擬ActionFilterAttribute ,但是我收到錯誤說明

不可覆蓋的成員上的設置無效

對於TempDataModelState

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.

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