【问题标题】:How to unit test Request.IsAuthenticated of razor view如何对 Razor 视图的 Request.IsAuthenticated 进行单元测试
【发布时间】:2018-07-12 05:36:46
【问题描述】:

我正在使用 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 生成的类。有什么线索吗?

【问题讨论】:

  • 如果您更改视图以实际输出值 Request.IsAuthenticated 作为 HTML 的一部分,它会在您的测试中呈现什么。是真是假?

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 它是在布局中呈现的部分视图,因此不确定如何传递此值。
  • 您可以将值存储在 ViewState/ViewBag 中并创建一个过滤器,在每次控制器调用后分配值
  • 感谢@Badulake..我正在使用 Viewdata 来实现结果。
猜你喜欢
  • 2010-11-24
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多