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