【问题标题】:How to do unit testing of ViewData in razor pages?如何在剃须刀页面中对 ViewData 进行单元测试?
【发布时间】:2022-01-24 03:06:37
【问题描述】:

具有以下精简代码(.net core 3.1):

public ActionResult OnGet()
{
    ViewData["ACustomMessage"] = $"This a custom message";

    return Page();
}

我需要一个单元测试来测试在 ViewData 中创建的消息。

public void Test_ViewData()
{
    var loggerMock = new Mock<ILogger<PrivacyModel>>();
    var httpContext = new DefaultHttpContext();
    var modelState = new ModelStateDictionary();
    var actionContext = new ActionContext(httpContext, new RouteData(), new PageActionDescriptor(), modelState);
    var modelMetadataProvider = new EmptyModelMetadataProvider();
    var viewData = new ViewDataDictionary(modelMetadataProvider, modelState);
    var tempData = new TempDataDictionary(httpContext, Mock.Of<ITempDataProvider>());
    var pageContext = new PageContext(actionContext)
    {
        ViewData = viewData
    };
    PrivacyModel privacyRazorPage = new PrivacyModel(loggerMock.Object)
    {
        PageContext = pageContext,
        TempData = tempData,
        Url = new UrlHelper(actionContext)
    };

    var resultPrivacy = privacyRazorPage.OnGet();

    Assert.AreEqual("This a custom message", ((PageResult)resultPrivacy).ViewData["ACustomMessage"]);
}

此测试不起作用,因为 resultPrivacy 作为实例化对象返回,但其所有属性都为 null。

【问题讨论】:

  • 框架是在运行时将值传递给结果的。但由于这是一个不会自动发生的独立单元测试。您需要检查页面模型的视图数据并在那里进行检查。

标签: c# unit-testing asp.net-core razor-pages asp.net-core-3.1


【解决方案1】:

您需要更改以下代码:

Assert.AreEqual("This a custom message", ((PageResult)resultPrivacy).ViewData["ACustomMessage"]);

收件人:

Assert.AreEqual("This a custom message", privacyRazorPage.ViewData["ACustomMessage"]);

整个工作演示:

public void Test_ViewData()
{
    var loggerMock = new Mock<ILogger<PrivacyModel>>();
    var httpContext = new DefaultHttpContext();
    var modelState = new ModelStateDictionary();
    var actionContext = new ActionContext(httpContext, new RouteData(), new PageActionDescriptor(), modelState);
    var modelMetadataProvider = new EmptyModelMetadataProvider();
    var viewData = new ViewDataDictionary(modelMetadataProvider, modelState);
    var tempData = new TempDataDictionary(httpContext, Mock.Of<ITempDataProvider>());
    var pageContext = new PageContext(actionContext)
    {
        ViewData = viewData
    };
    PrivacyModel privacyRazorPage = new PrivacyModel(loggerMock.Object)
    {
        PageContext = pageContext,
        TempData = tempData,
        Url = new UrlHelper(actionContext)
    };
    privacyRazorPage.OnGet();
    Assert.AreEqual("This a custom message", privacyRazorPage.ViewData["ACustomMessage"]);
}

【讨论】:

    猜你喜欢
    • 2016-01-30
    • 1970-01-01
    • 2021-10-22
    • 2022-01-19
    • 2021-10-27
    • 2020-04-15
    • 2011-11-01
    • 1970-01-01
    • 2012-08-03
    相关资源
    最近更新 更多