我有一个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);
}
}
}
答案 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是开源的,像这样的问题可以通过检查源代码。