通过单元测试调用时,控制器中的MVC RouteData为null

时间:2016-01-26 16:50:17

标签: asp.net-mvc-5

当我的控制器正常运行时,将填充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));
    }

这是预期的吗?这是因为当测试直接实例化时,路由引擎不参与调用控制器吗?

1 个答案:

答案 0 :(得分:2)

是的,这是预料之中的。控制器依赖于RequestContext来获取RouteData,并且只有"准备好"在created on the mvc pipelinecontroller request begins to execute之后。当你只是new时,就不会发生这种情况。

你可以做的是new手动(即ControllerContextRouteData等)或模拟它们,然后在要测试的控制器上设置这些属性。