Pseudorandom Knowledge

Testing the controller

The controller is the most straightforward part of ASP.NET MVC to test.

public class ShipController : Controller
{
    private readonly IShipRepository Repository;
 
    public ShipController() : this(new ShipRepository()) { }
 
    public ShipController(IShipRepository repository)
    {
        Repository = repository;
    }
 
    public ViewResult Index()
    {
        IEnumerable<Ship> ships = Repository.GetList();
        return View(ships);
    }
 
    public RedirectResult Create(Ship ship)
    {
        if (ModelState.IsValid)
        {
            Repository.Insert(ship);
        }
        return Redirect("/");
    }
}

The only thing this controller depends on is the repository which handles the model.

[TestClass]
public class ShipControllerTests
{
    [TestMethod]
    public void IndexReturnsAllShips()
    {
        var ships = new List<Ship>
            {
                new Ship { Name = "Ship 1"},
                new Ship { Name = "Ship 2"}
            };
 
        // Arrange
        var repository = Mock.Of<IShipRepository>(r => r.GetList() == ships);
        var controller = new ShipController(repository);
 
        // Act
        ViewResult result = controller.Index();
 
        // Assert
        Assert.AreEqual(ships, result.Model);
    }
 
    [TestMethod]
    public void CreateInsertsShip()
    {
        Ship ship = new Ship { Name = "New Ship" };
 
        // Arrange
        var repository = Mock.Of<IShipRepository>();
        var controller = new ShipController(repository);
 
        // Act
        controller.Create(ship);
 
        // Assert
        Mock.Get(repository).Verify(m => m.Insert(ship));
    }
 
    [TestMethod]
    public void CreateRedirectsToRoot()
    {
        Ship ship = new Ship { Name = "New Ship" };
 
        // Arrange
        var repository = Mock.Of<IShipRepository>();
        var controller = new ShipController(repository);
 
        // Act
        RedirectResult result = controller.Create(ship);
 
        // Assert
        Assert.AreEqual("/", result.Url);
    }
}

This is using Moq to replace the repository and the arrange-act-assert pattern to perform the tests.