我有一个用于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);
}
}
}
如果你看看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是开源的,通过检查源代码可以很容易地回答像这样的问题。