Search code examples
c#asp.net-mvcasp.net-coremstest

How to test controller method that use TempData in ASP MVC CORE


I want to write test for my controller method but I have Nullpointexceprion for TempData["EditMember"] = false; that I using in my method.

I have read several similar threads but I have not found a solution to this problem. I tried to use mocking but I also failed because none of the examples wanted to compile.

Here is my controller method


    public class MemberController : Controller
    {
        private readonly UnitOfWork _unitOfWork;

        public MemberController(IUnitOfWork unitOfWork)
        {
            _unitOfWork = unitOfWork as UnitOfWork;
        }


        public IActionResult CreateUpdate(string id = null, string table = null)
        {

            MemberViewModel model = null;

            TempData["EditMember"] = false;
            if (id != null)
            {
                TempData["EditMember"] = true;
                var member = _unitOfWork.MemberRepositories.FindBySRU(id);
                model = AutoMapper.Mapper.Map<Member, MemberViewModel>(member);
            }


            if (model == null)
                model = new MemberViewModel();

            TempData["HealthIssues"] = JsonConvert.SerializeObject(model.Player);
            TempData["Guardians"] = JsonConvert.SerializeObject(model.Player.Junior);

            return View(model);
        }

Test method

        [TestMethod]
        public void test()
        {
            //Arrange

            var memberController = new MemberController(new UnitOfWork(new DatabaseModel()));


            //Act
            var viewResult = memberController.CreateUpdate() as ViewResult;

            //Assert
        }

Is there an easy way to start such a test in ASP CORE using TempData?


Solution

  • You have to create an ITempDataDictionary object first, and then assign it to TempData property on your controller before accessing it. You can easily do it with mocks. Here is an (simplified) example with Moq:

    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.ViewFeatures;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using Moq;
    using TestProjectMvc.Controllers;
    
    namespace TestProjectMvc.Tests
    {
        [TestClass]
        public class MemberControllerTests
        {
            [TestMethod]
            public void CreateUpdateTest()
            {
                ITempDataProvider tempDataProvider = Mock.Of<ITempDataProvider>();
                TempDataDictionaryFactory tempDataDictionaryFactory = new TempDataDictionaryFactory(tempDataProvider);
                ITempDataDictionary tempData = tempDataDictionaryFactory.GetTempData(new DefaultHttpContext());
    
                MemberController controller = new MemberController(new UnitOfWork())
                {
                    TempData = tempData
                };
    
                ViewResult viewResult = controller.CreateUpdate(null) as ViewResult;
    
                Assert.IsFalse((bool)viewResult.TempData["EditMember"]);
    
                viewResult = controller.CreateUpdate("123") as ViewResult;
    
                Assert.IsTrue((bool)viewResult.TempData["EditMember"]);
            }
        }
    }