MVC .NET - 将用户模型传递给剃刀视图

时间:2012-08-23 13:24:19

标签: asp.net-mvc-3 unit-testing razor

我正在尝试对剃刀视图进行单元测试。特别是,我正在尝试编写一个Admin按钮 - 如果用户登录的是Admin,则会显示在主工具栏上。

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

剃刀:

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

但是,由于我们正在调用CurrentUser--一个在项目中其他地方设置的静态对象,我不确定我们是否不能单独测试这个剃刀视图。我认为我们必须创建一个User对象,登录用户的实例,并将其注入剃刀视图。

例如。

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

但是,如果我测试的剃须刀视图是_Layout页面怎么办?每当我渲染页面时,我是否必须注入当前用户?

有没有办法可以将当前用户注入View的父级?也许我必须覆盖View方法?有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

首先尝试在帐户控制器上调用LogOn Action来登录:

        [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;
        }

答案 1 :(得分:0)

您是否考虑过使用DI(依赖注入)容器(如ninject)? 然后你可以将CurrentUser添加到Controllers构造函数中,如下所示:

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输出。您只能检查您的模型是否设置正确。