Unit testing 针对具有authorize属性的控制器对匿名用户进行单元测试
我正在尝试构建一个单元测试,以确保未经验证的用户无法访问控制器。当我运行测试时,发现用户已通过身份验证。我如何进行模拟,以便测试发现模拟用户未经身份验证 我使用的是标识为2.0的mvc5 控制器Unit testing 针对具有authorize属性的控制器对匿名用户进行单元测试,unit-testing,asp.net-mvc-5,Unit Testing,Asp.net Mvc 5,我正在尝试构建一个单元测试,以确保未经验证的用户无法访问控制器。当我运行测试时,发现用户已通过身份验证。我如何进行模拟,以便测试发现模拟用户未经身份验证 我使用的是标识为2.0的mvc5 控制器 [Authorize] public class ProfileController : Controller { private ICompanyServiceLayer _service; public ProfileController(ICompanyServiceLayer
[Authorize]
public class ProfileController : Controller
{
private ICompanyServiceLayer _service;
public ProfileController(ICompanyServiceLayer service)
{
_service = service;
}
public ActionResult Index(int id)
{
/* cool stuff happens here */
return View();
}
}
试验
[测试]
公共无效索引作为非匿名用户()
{
//安排
Mock服务=新Mock();
GenericEntity id=新GenericEntity(“”);
Mock princ=新Mock();
princ.Setup(x=>x.Identity).Returns(id);
Mock contextBase=new Mock();
Setup(x=>x.User).Returns(princ.Object);
Mock controllerContext=新建Mock();
controllerContext.Setup(x=>x.HttpContext).Returns(contextBase.Object);
//控制器
ProfileController=新的ProfileController(service.Object);
controller.ControllerContext=ControllerContext.Object;
//表演
var结果=控制器指数(1);
//断言
Assert.IsInstanceOf(typeof(HttpStatusCodeResult),result);
}
根据blorkfish建议进行更新
[Test]
public void Index_As_Annonymous_User()
{
// arrange
Mock<ICompanyServiceLayer> service = new Mock<ICompanyServiceLayer>();
Mock<HttpRequestBase> request = new Mock<HttpRequestBase>();
request.Setup(x => x.IsAuthenticated).Returns(false);
Mock<HttpContextBase> contextBase = new Mock<HttpContextBase>();
contextBase.Setup(x => x.Request).Returns(request.Object);
// controller
ProfileController controller = new ProfileController(service.Object);
controller.ControllerContext = new ControllerContext(contextBase.Object, new RouteData(), controller);
// act
var result = controller.Index(1);
// assert
Assert.IsInstanceOf(typeof(HttpStatusCodeResult), result);
}
[测试]
公共无效索引作为非匿名用户()
{
//安排
Mock服务=新Mock();
模拟请求=新建模拟();
request.Setup(x=>x.IsAuthenticated)。返回(false);
Mock contextBase=new Mock();
Setup(x=>x.Request).Returns(Request.Object);
//控制器
ProfileController=新的ProfileController(service.Object);
controller.ControllerContext=新的ControllerContext(contextBase.Object,新路由数据(),controller);
//表演
var结果=控制器指数(1);
//断言
Assert.IsInstanceOf(typeof(HttpStatusCodeResult),result);
}
mvc框架检查HttpRequest.IsAuthenticated标志。要模拟这一点,您需要模拟httpContext和httpRequest:
var httpContext = MockRepository.GenerateMock<HttpContextBase>();
var httpRequest = MockRepository.GenerateMock<HttpRequestBase>();
httpContext.Stub(x => x.Request).Return(httpRequest);
httpRequest.Stub(x => x.IsAuthenticated).Return(false);
UserController controller = new UserController();
controller.ControllerContext
= new ControllerContext(httpContext, new RouteData(), controller);
var httpContext=MockRepository.GenerateMock();
var httpRequest=MockRepository.GenerateMock();
Stub(x=>x.Request).Return(httpRequest);
httpRequest.Stub(x=>x.IsAuthenticated).Return(false);
UserController=新的UserController();
controller.ControllerContext
=新控制器上下文(httpContext,新路由数据(),控制器);
使用Moq,您需要模拟HttpContextBase并确保其已验证
属性返回false
var mockHttpContext = new Mock<HttpContextBase>();
mockHttpContext.SetupGet(c => c.User.Identity.IsAuthenticated).Returns(false);
var mockControllerContext = new Mock<ControllerContext>();
mockControllerContext.Setup(c => c.HttpContext).Returns(mockHttpContext.Object);
controller.ControllerContext = mockControllerContext.Object;
var mockHttpContext=new Mock();
mockHttpContext.SetupGet(c=>c.User.Identity.IsAuthenticated)。返回(false);
var mockControllerContext=new Mock();
mockControllerContext.Setup(c=>c.HttpContext).Returns(mockHttpContext.Object);
controller.ControllerContext=mockControllerContext.Object;
然后,在控制器操作中运行以下操作应返回false:
User.Identity.IsAuthenticated
尝试了此操作,索引中的代码仍在执行中。如果不模拟身份主体,您将获得空值
var mockHttpContext = new Mock<HttpContextBase>();
mockHttpContext.SetupGet(c => c.User.Identity.IsAuthenticated).Returns(false);
var mockControllerContext = new Mock<ControllerContext>();
mockControllerContext.Setup(c => c.HttpContext).Returns(mockHttpContext.Object);
controller.ControllerContext = mockControllerContext.Object;