首页 > 解决方案 > 如何对 Razor 视图的 Request.IsAuthenticated 进行单元测试

问题描述

我正在使用 RazorGenerator 来测试视图。但是当我尝试模拟请求时,我可以看到 IsAuthenticated 属性被填充,但呈现时的视图没有返回所需的 HTML。

_Login.cshtml

@using System.Security.Claims
@if (Request.IsAuthenticated)

{

    <text>
        <ul class="nav navbar-nav navbar-right">
            <li>
                @Html.ActionLink(@welcome, null, null, null, new { id = "test1" })
            </li>
            <li>
                @Html.ActionLink("Sign out", "SignOut", "Account")
            </li>
        </ul>
    </text>
    }else
    {
        <ul class="nav navbar-nav navbar-right">
            <li>
                @Html.ActionLink("Log in", "SignIn", "Account", null, new {id = "test2" })
            </li>
        </ul>
    }

我有以下测试用例,它总是给我来自 else 条件的 html。

public void test23()
        {
            v_Request.SetupGet(x => x.IsAuthenticated).Returns(true);
            v_Context.SetupGet(x => x.Request).Returns(v_Request.Object);
            v_ControllerContext = new Mock<ControllerContext>(
                v_Context.Object,
                new RouteData(),
                v_Controller.Object);
            v_ControllerContext.Setup(x => x.HttpContext).Returns(v_Context.Object);
            v_ViewContext = new Mock<ViewContext>(
                v_ControllerContext.Object,
                new Mock<IView>().Object,
                null,
                new TempDataDictionary(),
                null);
            _Views_Shared__Login_cshtml view = new _Views_Shared__Login_cshtml();

            view.ViewContext = new ViewContext(v_ControllerContext.Object, new Mock<IView>().Object, view.ViewData, new TempDataDictionary(), new Mock<TextWriter>().Object);

            HtmlDocument doc = view.RenderAsHtml();
        }

_Views_Shared__Login_cshtml是 RazorGenerator 生成的类。任何线索..?

标签: c#asp.net-mvcunit-testingmoqrazorgenerator

解决方案


如果您想对 View 进行单元测试,您可以将其视为要求重构代码的提示。

视图很少被测试,因为它们不应该有太多的功能。测试应该集中在生成它的代码中。

正如您所说,该视图来自父母。您可以创建一个过滤器:

public class MyAuthFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        ViewBag=filterContext.HttpContext.Request.IsAuthenticated;
    }
}

注册它:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new MyAuthFilterAttribute ());
}

您将始终充满 ViewBag


推荐阅读