I made a slight change to my new class to make unit testing easier:
public class JsonDotNetResult : ActionResult
{
public JsonDotNetResult(object data)
{
Data = data;
}
//Name the property Data and make the getter public
public object Data { get; private set; }
public override void ExecuteResult(ControllerContext context)
{
context.HttpContext.Response.AddHeader("content-type", "application/json");
context.HttpContext.Response.Write(JsonConvert.SerializeObject(Data));
}
}
}
This more closely resembles JsonResult in System.Web.Mvc and allows me to unit test either with a generic method...

Unit test helper:
public static TReturn GetDataFromJsonResult<TJsonType, TReturn>(this ActionResult result) where TJsonType : ActionResult
{
var jsonResult = (TJsonType)result;
var data = jsonResult.GetType().GetProperty("Data").GetValue(jsonResult);
return (TReturn)data;
}
Unit Test Example:
[TestMethod]
public void ControllerMethod_WhenMethodCalled_ThenSomeRecordsAreReturned()
{
// arrange
var records = new List<string> { "Record1", "Record2" };
var expectedRecordCount = records.Count();
myService.Setup(x => x.GetRecordsFromDatabase()).Returns(records);
// act
var result = myController.GetRecords(); //Assuming this controller method returns JsonDotNetResult
// assert
var jsonResult = result.GetDataFromJsonResult<JsonDotNetResult, IEnumerable<string>>();
Assert.AreEqual(expectedRecordCount, jsonResult.Count());
}
This line can be changed if the controller return the normal JsonResult:
var jsonResult = result.GetDataFromJsonResult<JsonResult, IEnumerable<string>>();