In my last post I advocated strongly for writing tests for any project that you inherit that does not have them.
As I begin to build a test suite for the code I am now responsible for, I am going to be writing about challenges I run into writing tests in a framework with which I am not heavily experienced.
Mocks Are Your Friend
When writing tests, it is important to isolate the code that you are testing to make sure that only it is being tested. You usually want to test specific behavior from a specific scenario.
One of the ways you can do this is by mocking or faking the responses from any other parts of the code that it calls.
The framework that I have decided to use for this is called Moq and makes it pretty easy to create a small stand in object that fakes the response you want.
Using these I was able to isolate problem areas in the test to determine the resources I needed to get the code to operate correctly.
HttpContext in Your Test
The project I am working on is an ASP.NET application. The way it was designed relies on redirects, the HttpContext.Current, and Sessions. This means that testing things can get tricky.
I was trying to Mock out the responses I needed for my test and made good headway doing so. But after doing a bunch of research along with trial and error, the best place I found to create the HttpContext for the test is in the TestInitialize portion of the test.
[TestInitialize]
public void TestInit()
{
var request = new HttpRequest("", "http://localhost", "");
var response = new HttpResponse(new StringWriter());
var testHttpContext = new HttpContext(request, response);
HttpContext.Current = testHttpContext;
}
Their are many cases where you would just want to make a simple Mock of the HttpContext and whatever you were trying to get out of it in the function, but the function I was testing used so many aspects of it that it just made sense to create one in the test initialization.
Session in Your Test
The main problem I ran into was with Session. Every use of Session in the code I was testing gave an error of “Object reference set to Null.” Additionally their did not seem to be a good way to Mock it out. It is not created by default in a new HttpContext, so putting that in the TestInitialize section did not work.
After doing a lot of digging, I finally found a way to add a new Session to the HttpContext. You have to create a HttpSessionStateContainer and then use the SessionStateUtility to add it to your HttpContext object in the TestInitialize code.
var sessionContainer = new HttpSessionStateContainer("id", new SessionStateItemCollection(),
new HttpStaticObjectsCollection(), 10, true,
HttpCookieMode.AutoDetect,
SessionStateMode.InProc, false);
SessionStateUtility.AddHttpSessionStateToContext(testHttpContext, sessionContainer);
If you are tearing your hair out trying to figure out how searching for things like “C# asp.net test set httpcontext” or “C# asp.net test mock session”, then hopefully this helps you.