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