1

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

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

剃刀:

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

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

例如。

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

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

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

谢谢!

4

2 回答 2

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

于 2012-08-27T11:25:53.913 回答
0

首先尝试在 Account Controller 上调用 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;
        }
于 2012-08-23T14:51:56.957 回答