【问题标题】:How to test controller method that use TempData in ASP MVC CORE [duplicate]如何测试在 ASP MVC CORE 中使用 TempData 的控制器方法 [重复]
【发布时间】:2019-04-30 05:34:14
【问题描述】:

我想为我的控制器方法编写测试,但我有 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
        }

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

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core mstest


    【解决方案1】:

    您必须先创建一个ITempDataDictionary 对象,然后在访问它之前将其分配给控制器上的 TempData 属性。您可以使用模拟轻松完成此操作。这是一个(简化的)起订量示例:

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

    【讨论】:

    • 哦,现在我明白了。我看到了类似的解决方案,但没有奏效,因为我使用了错误的库,显示 TempDataDictionary 有 0 个参数。谢谢@Peska 我喜欢它:)
    猜你喜欢
    • 2017-07-23
    • 2021-04-01
    • 2015-04-24
    • 2023-02-22
    • 2019-06-25
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多