Search code examples
unit-testingrhino-mocksmvccontribmvccontrib-testhelper

MVCContrib TestHelper and User.Identity.Name, Server.MapPath and Form Collection


I am new to MVCContrib Testhelper and mocking with Rhino.

I am needing assistance with unit testing a controller which relies on User.Identity.Name, Server.MapPath and Form Collection.

I started off with

var controller = new SubmitController();
var builder = new TestControllerBuilder();
builder.InitializeController(controller);

I found this post for setting User.Identity.Name

controller.ControllerContext = TestHelper.MockControllerContext(controller).WithAuthenticatedUser("domain\\username");

At this point, in my controller i am now able to get to the User.Identity. The problem then became how to i set Form Collection variables. Setting

builder.Form.Add("testvar","1");

no longer worked. It seemed that now I had to access via

controller.HttpContext.Request.Form.Add("testvar","1)

This seemed to work, but at this point, i was no longer using builder(TestControllerBuilder) above.

I then had to mock Server which raised up more issues. How can I continue to use builder but use mocks or stubs for httpContext, HttpRequest, Server etc. I was sort of expecting that builder would have methods for setting expected values for HttpRequest, Server etc.

Thanks


Solution

  • When you replaced the controller's ControllerContext that removed the MVCContrib context. Try something like this:

    using MvcContrib.TestHelper;
    using MvcContrib.TestHelper.Fakes;
    using Rhino.Mocks;
    
    ...
    var builder = new TestControllerBuilder();
    builder.Form.Add("testvar", "1"); 
    builder.HttpContext.User = new FakePrincipal(new FakeIdentity("UserName"), new string[] { "Role" });
    builder.HttpContext.Server.Stub(x => x.MapPath(Arg<string>.Is.Anything)).Return("Value");
    builder.InitializeController(controller);