Not A Subscriber?
Join thousands of people who build and refuse to get left behind. One message a week on building, using AI as an accelerator, and staying sharp in the new AI frontier.
Receive one free message a weekMarch 20, 2009 Donn Felker
Unit Testing JsonResult in MVC
Unit testing ActionResults is fairly easy yet JsonResults can pose a problem. I’ve seen a few ways to do this and they just seemed like “too much” to me. So here’s a way that I’ve devised that works very well. Its sort of has a “hack” feel to it, but it works perfectly.
Controller Action:
public JsonResult AddContent(string content, string contentName){ var isExistingContent = false; var wasAdded = false;
if (_service.IsNewContent(contentName)) { _service.AddNewContent(content, contentName); isExistingContent = false; wasAdded = true; } // do some other logic, etc
return Json(new {isExisting = isExistingContent, added = wasAdded});}If you want to test the JsonResult that is coming back then we need a way to grab it. Since its an anonymous type it makes things a bit more tricky.
Here’s how to test it:
[Test]public void The_controller_should_be_able_to_add_new_content(){ // Arrange _mockService.Expect(x => x.IsNewContent("foo")).Return(false); _mockService.Expect(x => x.AddNewContent("blah", "fooey")).IgnoreArguments();
// Act var result = _controller.AddContent("fresh data", "foo");
// Assert var wrapper = new System.Web.Routing.RouteValueDictionary(result.Data); // Magic black box Assert.That(wrapper["isExisting"], Is.False); Assert.That(wrapper["added"], Is.True);
}We can cast the anon type to a RouteValueDictionary and then test off of the keys. Blammo. Simple.