为什么RedirectToActionResult ControllerName返回NULL?

时间:2018-01-01 14:24:58

标签: asp.net-mvc asp.net-mvc-4 xunit

我有一个MVC的Xunit测试类:

using System;
using Xunit;
using Home.Controllers;
using Microsoft.AspNetCore.Mvc;
using Tester.Models;
using Xunit.Abstractions;

namespace ClassLibrary1
{

    public class Class1
    {

        [Fact]
        public void CreateinController()
        {
            HomeController c = new HomeController();

            var result = c.Create();

            //result moet een view zijn
            var viewResult = Assert.IsType<ViewResult>(result);

            //Juiste redirection

            var result2 = c.Create(null);

            var redirectToActionResult =
            Assert.IsType<RedirectToActionResult>(result2);

            Assert.Equal("Home", redirectToActionResult.ControllerName);
            Assert.Equal("BoekingVerwerken", redirectToActionResult.ActionName);


        }


    }
}

每当我运行测试时,ActionName都会通过测试,因为它实际上包含了值。但ControllerName似乎是NULL值,为什么会这样? 当Action有一个值时,为什么Controller不会有一个?我应该把控制器放在RTA中吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Tester.Models;

namespace Home.Controllers
{
    public class HomeController : Controller
    {

        [HttpGet]
        public IActionResult Create()
        {
            return View();
        }

        [HttpPost]
        public IActionResult Create(HotelBoeking boeking)
        {
            return RedirectToAction("BoekingVerwerken", boeking);
        }

        [HttpGet]
        public IActionResult BoekingVerwerken(HotelBoeking boeking)
        {
            return View(boeking);
        }

    }
}

1 个答案:

答案 0 :(得分:1)

如果您查看Controller.cs source code,您会看到RedirectToAction返回RedirectToRouteResult类型,而不是RedirectToActionResult类型。

source code of RedirectToRouteResult.cs可以看到,您可以从RouteValues属性中获取控制器名称。此类型没有ControllerName属性。

var redirectToRouteResult =
        Assert.IsType<RedirectToRouteResult>(result2);

Assert.Equal("Home", redirectToRouteResult.RouteValues["controller"]);
  

我不完全确定XUnit的语法是正确的,因为我没有用它,但是你应该从中消除这一点,因为MVC是开源的,像这样的问题可以通过检查源代码。