我正在尝试对剃刀视图进行单元测试。特别是,我正在尝试编写一个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方法?有什么想法吗?
谢谢!
答案 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输出。您只能检查您的模型是否设置正确。