Unit testing 针对具有authorize属性的控制器对匿名用户进行单元测试

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

我正在尝试构建一个单元测试,以确保未经验证的用户无法访问控制器。当我运行测试时,发现用户已通过身份验证。我如何进行模拟,以便测试发现模拟用户未经身份验证

我使用的是标识为2.0的mvc5

控制器

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