Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unit tests on MVC validation

How can I test that my controller action is putting the correct errors in the ModelState when validating an entity, when I'm using DataAnnotation validation in MVC 2 Preview 1?

Some code to illustrate. First, the action:

    [HttpPost]     public ActionResult Index(BlogPost b)     {         if(ModelState.IsValid)         {             _blogService.Insert(b);             return(View("Success", b));         }         return View(b);     } 

And here's a failing unit test that I think should be passing but isn't (using MbUnit & Moq):

[Test] public void When_processing_invalid_post_HomeControllerModelState_should_have_at_least_one_error() {     // arrange     var mockRepository = new Mock<IBlogPostSVC>();     var homeController = new HomeController(mockRepository.Object);      // act     var p = new BlogPost { Title = "test" };            // date and content should be required     homeController.Index(p);      // assert     Assert.IsTrue(!homeController.ModelState.IsValid); } 

I guess in addition to this question, should I be testing validation, and should I be testing it in this way?

like image 209
Matthew Groves Avatar asked Aug 13 '09 02:08

Matthew Groves


People also ask

What is unit testing validation?

What is Unit Testing? UNIT TESTING is a type of software testing where individual units or components of a software are tested. The purpose is to validate that each unit of the software code performs as expected. Unit Testing is done during the development (coding phase) of an application by the developers.


1 Answers

Hate to necro a old post, but I thought I'd add my own thoughts (since I just had this problem and ran across this post while seeking the answer).

  1. Don't test validation in your controller tests. Either you trust MVC's validation or write your own (i.e. don't test other's code, test your code)
  2. If you do want to test validation is doing what you expect, test it in your model tests (I do this for a couple of my more complex regex validations).

What you really want to test here is that your controller does what you expect it to do when validation fails. That's your code, and your expectations. Testing it is easy once you realize that's all you want to test:

[test] public void TestInvalidPostBehavior() {     // arrange     var mockRepository = new Mock<IBlogPostSVC>();     var homeController = new HomeController(mockRepository.Object);     var p = new BlogPost();      homeController.ViewData.ModelState.AddModelError("Key", "ErrorMessage"); // Values of these two strings don't matter.       // What I'm doing is setting up the situation: my controller is receiving an invalid model.      // act     var result = (ViewResult) homeController.Index(p);      // assert     result.ForView("Index")     Assert.That(result.ViewData.Model, Is.EqualTo(p)); } 
like image 82
ARM Avatar answered Oct 09 '22 09:10

ARM