Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 NET-将用户模型传递给razor视图_Asp.net Mvc 3_Unit Testing_Razor - Fatal编程技术网

Asp.net mvc 3 NET-将用户模型传递给razor视图

Asp.net mvc 3 NET-将用户模型传递给razor视图,asp.net-mvc-3,unit-testing,razor,Asp.net Mvc 3,Unit Testing,Razor,我试图对razor视图进行单元测试。特别是,我正在尝试编写一个管理员按钮-如果登录的用户是管理员,它会出现在主工具栏上 目前我们没有任何测试,其工作方式是通过设置一个名为CurrentUser的静态对象 剃刀: @if CurrentUser.IsAdmin() { <button>admin</button> } 但是如果我正在测试的razor视图是一个_布局页面呢?在呈现页面时,是否必须注入当前用户 有没有一种方法可以将当前用户注入视图的父级?也许我必须重

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

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

剃刀:

@if CurrentUser.IsAdmin()
{
     <button>admin</button>
}
但是如果我正在测试的razor视图是一个_布局页面呢?在呈现页面时,是否必须注入当前用户

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


谢谢

尝试在要首先登录的帐户控制器上调用登录操作:

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

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

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

    ActionResult Index(){ 
        return View(_currentUser); 
    }
} 
并将静态类分配给DI(如果是ninject):


但是您不能直接用它来测试HTML输出。您只能检查您的模型是否正确设置/运行。

如果您具有身份验证,您可以在视图中使用@if User.IsInRole(“Admin”)而不是静态类CurrentUser.true,但User仍然是静态对象。对于设置我的测试-我如何设置一个登录的冒牌用户,并且恰好是管理员-这样我就可以测试我的按钮是否出现(测试通过)或没有出现(测试失败)。你知道我的意思吗?谢谢你的回答;它会起作用,但理想情况下,我希望在没有控制器参与的情况下自己测试视图。例如,_布局未链接到特定控制器。
class Controller 
{  
    private _currentUser;
    public Controller(IUser currentUser) {
        _currentUser = currentUser
    }

    ActionResult Index(){ 
        return View(_currentUser); 
    }
} 
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());
}