Unittesting Url.Action (using Rhino Mocks?)

Posted by Kristoffer Ahl on Stack Overflow See other posts from Stack Overflow or by Kristoffer Ahl
Published on 2009-06-04T15:35:51Z Indexed on 2010/06/09 19:22 UTC
Read the original article Hit count: 389

I'm trying to write a test for an UrlHelper extensionmethod that is used like this:

Url.Action<TestController>(x => x.TestAction());

However, I can't seem set it up correctly so that I can create a new UrlHelper and then assert that the returned url was the expected one. This is what I've got but I'm open to anything that does not involve mocking as well. ;O)

    	[Test]
	public void Should_return_Test_slash_TestAction()
	{
		// Arrange
		RouteTable.Routes.Add("TestRoute", new Route("{controller}/{action}", new MvcRouteHandler()));
		var mocks = new MockRepository();
		var context = mocks.FakeHttpContext(); // the extension from hanselman
		var helper = new UrlHelper(new RequestContext(context, new RouteData()), RouteTable.Routes);

		// Act
		var result = helper.Action<TestController>(x => x.TestAction());

		// Assert
		Assert.That(result, Is.EqualTo("Test/TestAction"));
	}

I tried changing it to urlHelper.Action("Test", "TestAction") but it will fail anyway so I know it is not my extensionmethod that is not working. NUnit returns:

NUnit.Framework.AssertionException: Expected string length 15 but was 0. Strings differ at index 0.
Expected: "Test/TestAction"
But was:  <string.Empty>

I have verified that the route is registered and working and I am using Hanselmans extension for creating a fake HttpContext. Here's what my UrlHelper extentionmethod look like:

    	public static string Action<TController>(this UrlHelper urlHelper, Expression<Func<TController, object>> actionExpression) where TController : Controller
	{
		var controllerName = typeof(TController).GetControllerName();
		var actionName = actionExpression.GetActionName();

		return urlHelper.Action(actionName, controllerName);
	}

	public static string GetControllerName(this Type controllerType)
	{
		return controllerType.Name.Replace("Controller", string.Empty);
	}

	public static string GetActionName(this LambdaExpression actionExpression)
	{
		return ((MethodCallExpression)actionExpression.Body).Method.Name;
	}

Any ideas on what I am missing to get it working??? / Kristoffer

© Stack Overflow or respective owner

Related posts about asp.net-mvc

Related posts about unit-testing