First, create an abstraction for your data access code (mocking DbContext is not a very convenient thing):
public interface IMemberRepository { void Add(Member member); }
and depend on your controller.
public MemberController(IMemberRepository repository) { this.repository = repository; }
This will make it easy to get a data access code. Next, write down the tests that verify the behavior of the controller (here I use NUnit and Moq):
private MemberController controller; private Mock<IMemberRepository> repositoryMock; private Member member; [SetUp] public void Setup() { repositoryMock = new Mock<IMemberRepository>(); controller = new MemberController(repositoryMock.Object); member = new Member { MemID = 123, MemName = "sruthy" }; } [Test] public void ShouldCreateMemberWhenItIsValid() { var result = (RedirectToRouteResult)controller.Create(member); Assert.That(result.RouteValues["action"], Is.EqualTo("Index")); repositoryMock.Verify(r => r.Add(member)); } [Test] public void ShouldNotCreateMemberWhenItIsNotValid() { controller.ModelState.AddModelError("MemName", "Something wrong"); var result = (ViewResult)controller.Create(member); Assert.That(result.ViewName, Is.Empty); }
And write the implementation:
[HttpPost] public ActionResult Create(Member member) { if (ModelState.IsValid) { repository.Add(member); return RedirectToAction("Index"); } return View(member); }
source share