I am a fan of testing my code and have been using SpecsFor, written by Matt Honeycutt, for a lot of my BDD-style unit testing lately. It makes testing very clear and easy to read, comes baked-in with Moq, StructureMap, and a whole lot more goodness.
One of the pain-points of testing ASP.NET MVC is dealing with the controller context, request, response, server, etc. So, I have extended SpecsFor a little bit for my controllers (in both F# and C#).
C#
namespace SpecsForExtensions
{
using System;
using System.Security.Principal;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
public class ControllerSpecsFor<T> : DbSpecsFor<T>
where T : Controller
{
protected override void InitializeClassUnderTest ()
{
base.InitializeClassUnderTest ();
var context = GetMockFor<HttpContextBase> ();
var session = GetMockFor<HttpSessionStateBase> ();
var request = GetMockFor<HttpRequestBase> ();
var response = GetMockFor<HttpResponseBase> ();
var server = GetMockFor<HttpServerUtilityBase> ();
var user = GetMockFor<IPrincipal> ();
var identity = GetMockFor<IIdentity> ();
var uri = new Uri ("http://localhost:12345");
var requestContext = new RequestContext (context.Object, new RouteData ());
context.Setup (x => x.Session).Returns (session.Object);
context.Setup (x => x.Server).Returns (server.Object);
context.Setup (x => x.Request).Returns (request.Object);
context.Setup (x => x.Response).Returns (response.Object);
context.Setup (x => x.User).Returns (user.Object);
request.Setup (x => x.Url).Returns (uri);
user.Setup (x => x.Identity).Returns (identity.Object);
SUT.ControllerContext = new ControllerContext (context.Object, new RouteData (), SUT);
SUT.Url = new UrlHelper (requestContext);
}
}
}
F#
namespace SpecsForExtensions
open System
open System.Security.Principal
open System.Web
open System.Web.Mvc
open System.Web.Routing
open SpecsFor
type ControllerSpecsFor<'a when 'a : not struct and 'a :> Controller>() =
inherit SpecsFor<'a>()
override this.InitializeClassUnderTest() =
base.InitializeClassUnderTest()
let context = this.GetMockFor<HttpContextBase>()
let session = this.GetMockFor<HttpSessionStateBase>()
let request = this.GetMockFor<HttpRequestBase>()
let response = this.GetMockFor<HttpResponseBase>()
let server = this.GetMockFor<HttpServerUtilityBase>()
let user = this.GetMockFor<IPrincipal>()
let identity = this.GetMockFor<IIdentity>()
let uri = new Uri("http://localhost:1234")
let requestContext = new RequestContext(context.Object, new RouteData())
context.Setup<_>(fun x -> x.Session).Returns(session.Object) |> ignore
context.Setup<_>(fun x -> x.Server).Returns(server.Object) |> ignore
context.Setup<_>(fun x -> x.Request).Returns(request.Object) |> ignore
context.Setup<_>(fun x -> x.Response).Returns(response.Object) |> ignore
context.Setup<_>(fun x -> x.User).Returns(user.Object) |> ignore
request.Setup<_>(fun x -> x.Url).Returns(uri) |> ignore
user.Setup<_>(fun x -> x.Identity).Returns(identity.Object) |> ignore
this.SUT.ControllerContext <- new ControllerContext (context.Object, new RouteData(), this.SUT)
this.SUT.Url <- new UrlHelper(requestContext)
No comments:
Post a Comment