我有几个 ActionMethods 可以像这样查询 Controller.User 的角色
bool isAdmin = User.IsInRole("admin");
在那个条件下方便地行动。
我开始用这样的代码对这些方法进行测试
[TestMethod]
public void HomeController_Index_Should_Return_Non_Null_ViewPage()
{
HomeController controller = new HomePostController();
ActionResult index = controller.Index();
Assert.IsNotNull(index);
}
并且该测试失败,因为未设置 Controller.User。 有什么想法吗?
最佳答案
您需要模拟 ControllerContext、HttpContextBase 和最后的 IPrincipal 来模拟 Controller 上的用户属性。使用 Moq (v2) 以下行的内容应该可以工作。
[TestMethod]
public void HomeControllerReturnsIndexViewWhenUserIsAdmin() {
var homeController = new HomeController();
var userMock = new Mock<IPrincipal>();
userMock.Expect(p => p.IsInRole("admin")).Returns(true);
var contextMock = new Mock<HttpContextBase>();
contextMock.ExpectGet(ctx => ctx.User)
.Returns(userMock.Object);
var controllerContextMock = new Mock<ControllerContext>();
controllerContextMock.ExpectGet(con => con.HttpContext)
.Returns(contextMock.Object);
homeController.ControllerContext = controllerContextMock.Object;
var result = homeController.Index();
userMock.Verify(p => p.IsInRole("admin"));
Assert.AreEqual(((ViewResult)result).ViewName, "Index");
}
当用户不是管理员时测试行为就像更改 userMock 对象上设置的期望以返回 false 一样简单。
关于c# - 如何使用最小起订量模拟 Controller.User,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/758066/