How to unit-test an MVC controller action which depends on authentication in c#?

后端 未结 2 463
小蘑菇
小蘑菇 2020-12-04 13:36

I\'d like to write (in c#) a unit-test for an MVC controller action which might return one view or the other, depending on whether the request is authenticated. How can this

相关标签:
2条回答
  • 2020-12-04 14:04

    Using mocking and dependency injection. The following assumes that you're checking that it is authenticated and then accessing the user object to get the user's id. Uses RhinoMocks.

    // mock context variables
    var username = "user";
    var httpContext = MockRepository.GenerateMock<HttpContextBase>();
    var request = MockRepository.GenerateMock<HttpRequestBase>();
    var identity = MockRepository.GenerateMock<IIdentity>();
    var principal = MockRepository.GenerateMock<IPrincipal>();
    
    httpContext.Expect( c => c.Request ).Return( request ).Repeat.AtLeastOnce();
    request.Expect( r => r.IsAuthenticated ).Return( true ).Repeat.AtLeastOnce();
    httpContext.Expect( c => c.User ).Return( principal ).Repeat.AtLeastOnce();
    principal.Expect( p => p.Identity ).Return( identity ).Repeat.AtLeastOnce();
    identity.Expect( i => i.Name ).Return( username ).Repeat.AtLeastOnce();
    
    var controller = new MyController();
    // inject context
    controller.ControllerContext = new ControllerContext( httpContext,
                                                          new RouteData(),
                                                          controller );
    
    var result = controller.MyAction() as ViewResult;
    
    Assert.IsNotNull( result );
    
    // verify that expectations were met
    identity.VerifyAllExpectations();
    principal.VerifyAllExpectations();
    request.VerifyAllExpectations();
    httpContext.VerifyAllExpectations();
    
    0 讨论(0)
  • 2020-12-04 14:11

    You can mock your Request. Something like this (Moq using):

    var request = new Mock<HttpRequestBase>();
    request.SetupGet(x => x.IsAuthenticated).Returns(true); // or false
    
    var context = new Mock<HttpContextBase>();
    context.SetupGet(x => x.Request).Returns(request.Object);
    
    var controller = new YourController();
    controller.ControllerContext = 
           new ControllerContext(context.Object, new RouteData(), controller);
    
    // test
    
    ViewResult viewResult = (ViewResult)controller.SomeAction();
    
    Assert.True(viewResult.ViewName == "ViewForAuthenticatedRequest");
    
    0 讨论(0)
提交回复
热议问题