如何在ASP MVC CORE中测试使用TempData的控制器方法[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我想为我的控制器方法编写测试,但我有Nullpointexceprion用于我在我的方法中使用的TempData["EditMember"] = false;

我已经阅读了几个类似的线程,但我还没有找到解决这个问题的方法。我试图使用模拟,但我也失败了,因为没有一个例子想要编译。

这是我的控制器方法


    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);
        }

测试方法

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

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


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

            //Assert
        }

有没有一种简单的方法可以使用TempData在ASP CORE中开始这样的测试?

c# asp.net-mvc asp.net-core mstest
1个回答
1
投票

您必须首先创建一个ITempDataDictionary对象,然后在访问它之前将其分配给控制器上的TempData属性。你可以用模拟轻松完成。这是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"]);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.