ASP.NET MVC Unit Testing Controllers - Repositories
- by Brian McCord
This is more of an opinion seeking question, so there may not be a "right" answer, but I would welcome arguments as to why your answer is the "right" one.
Given an MVC application that is using Entity Framework for the persistence engine, a repository layer, a service layer that basically defers to the repository, and a delete method on a controller that looks like this:
    public ActionResult Delete(State model)
    {
        try
        {
            if( model == null )
            {
                return View( model );
            }
            _stateService.Delete( model );
            return RedirectToAction("Index");
        }
        catch
        {
            return View( model );
        }
    }
I am looking for the proper way to Unit Test this.  Currently, I have a fake repository that gets used in the service, and my unit test looks like this:
    [TestMethod]
    public void Delete_Post_Passes_With_State_4()
    {
        //Arrange
        var stateService = GetService();
        var stateController = new StateController( stateService );
        ViewResult result = stateController.Delete( 4 ) as ViewResult;
        var model = (State)result.ViewData.Model;
        //Act
        RedirectToRouteResult redirectResult = stateController.Delete( model ) as RedirectToRouteResult;
        stateController = new StateController( stateService );
        var newresult = stateController.Delete( 4 ) as ViewResult;
        var newmodel = (State)newresult.ViewData.Model;
        //Assert
        Assert.AreEqual( redirectResult.RouteValues["action"], "Index" );
        Assert.IsNull( newmodel );
    }
Is this overkill?  Do I need to check to see if the record actually got deleted (as I already have Service and Repository tests that verify this)?  Should I even use a fake repository here or would it make more sense just to mock the whole thing?
The examples I'm looking at used this model of doing things, and I just copied it, but I'm really open to doing things in a "best practices" way.
Thanks.