当我的控制器正常运行时,将填充RouteData。但是当我运行或调试测试时,RouteData为null。 ASP.NET MVC5。
控制器
public class HomeController : Controller
{
public ActionResult Index()
{
var controller = this.RouteData.Values["controller"]; // null ref exception
var action = this.RouteData.Values["action"];
var id = this.RouteData.Values["id"];
ViewBag.Message = string.Format("{0}::{1} {2}", controller, action, id);
return View();
}
测试
[TestClass]
public class HomeControllerTest
{
[TestMethod]
public void Index()
{
HomeController controller = new HomeController();
ViewResult result = controller.Index() as ViewResult;
Assert.AreEqual(false, string.IsNullOrWhiteSpace(result.ViewBag.Message));
}
这是预期的吗?这是因为当测试直接实例化时,路由引擎不参与调用控制器吗?
答案 0 :(得分:2)
是的,这是预料之中的。控制器依赖于RequestContext
来获取RouteData,并且只有"准备好"在created on the mvc pipeline和controller request begins to execute之后。当你只是new
时,就不会发生这种情况。
你可以做的是new
手动(即ControllerContext
,RouteData
等)或模拟它们,然后在要测试的控制器上设置这些属性。