如何对剃刀视图的Request.IsAuthenticated进行单元测试

时间:2018-07-12 05:36:47

标签: c# asp.net-mvc unit-testing moq razorgenerator

我正在使用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生成的类。任何线索..?

1 个答案:

答案 0 :(得分:2)

如果要对视图进行单元测试,则可以将其视为提示,要求在代码中进行重构。

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

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

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