2012-08-23 66 views
1

我想单元测试剃刀视图。特别是,我试图编写一个管理员按钮 - 如果用户登录时显示在主工具栏上是一个管理员。MVC .NET - 将用户模型传递给剃刀视图

目前我们没有任何测试,它的工作方式是设置一个名为CurrentUser的静态对象。

剃刀:

@if CurrentUser.IsAdmin() 
{ 
    <button>admin</button> 
} 

然而,由于我们正在调用CurrentUser - 静态对象在项目中的其他地方设置,我不知道,如果我们不能单元测试这个Razor视图独立。我想我们必须制作一个User对象,让用户登录一个实例,然后将其注入到剃须刀视图中。

例如。

Controller 
{ 
    ActionResult Index(){ 
     var currentUser = //somehow get current user 
     return View(currentUser); 
} 

但是如果我测试的剃须刀视图是_Layout页面呢?当我渲染页面时,是否需要注入当前用户?

有没有一种方法可以将当前用户注入View的父级?也许我必须重写View方法?有任何想法吗?

谢谢!

+0

如果你有身份验证,您可以在视图中使用: @if User.IsInRole(“管理”) 而不是静态类CurrentUser。 –

+0

是true,但User仍然是一个静态对象。为了设置我的测试 - 我怎样才能设置一个假的用户登录,恰巧是一个管理员 - 这样我可以测试我的按钮是否出现(测试通过)或不出现(测试失败)。你懂我的意思吗? – Karan

回答

0

尝试调用账户控制器登录行动首先在登录:

 [TestMethod] 
     public void Index() 
     { 
      // Arrange 
      AccountController account = new AccountController(); 
      HomeController controller = new HomeController(); 

      var accRes = account.LogOn(new Models.LogOnModel() { UserName = "mylogin", Password = "abc123" }, string.Empty); 

      // Act 
      ViewResult result = controller.Index() as ViewResult; 
     } 
+0

谢谢你的回答;它会起作用,但理想情况下,我想在没有控制器参与的情况下自行测试视图。例如,_layout没有链接到特定的控制器。 – Karan

0

你有没有想过使用DI(依赖注入)容器(如ninject)? 然后你可以在CurrentUser添加到控制器的构造是这样的:

class Controller 
{ 
    private _currentUser; 
    public Controller(IUser currentUser) { 
     _currentUser = currentUser 
    } 

    ActionResult Index(){ 
     return View(_currentUser); 
    } 
} 

并分配静态类的DI(在ninject的情况下):

ninjectKernel.Bind<IUser>().To<CurrentUser>(); 

在单元测试中,你可以简单地用您的测试用户实例化控制器:

[TestMethod]   
public void Index()   
{   
    // Arrange   
    CurrentUser currentUser = new CurrentUser() { Role = "Admin" };   
    HomeController controller = new HomeController(currentUser);     

    // Act   
    ViewResult result = controller.Index() as ViewResult; 
    Assert.IsTrue(((CurrentUser)result.ViewData.Model).IsAdmin()); 
} 

但是,您不能直接测试HTML输出。您只能检查您的模型是否设置正确。

相关问题