有没有办法在视图中单元测试ASP.NET MVC ViewBag属性集?

Jim*_*Jim 19 unit-testing asp.net-mvc-3

假设我在页面顶部有一个包含以下代码的视图:

@{
    ViewBag.Title = "About Us";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
Run Code Online (Sandbox Code Playgroud)

我有一个控制器方法:

    public ActionResult About()
    {
        return View();
    }
Run Code Online (Sandbox Code Playgroud)

如何测试ViewBag设置是否正确?

我试过以下代码.

[TestCase]
public void About()
{
    var controller = new AboutController();
    var ar = controller.About() as ViewResult;
    Assert.AreEqual("About Us", ar.ViewBag.Title);
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行测试时,我得到以下结果:

Tests.Controllers.AboutControllerTests.About():
    Expected: "About Us"
    But was: null
Run Code Online (Sandbox Code Playgroud)

Phi*_*ler 56

由于ViewData和ViewBag都使用相同的存储模式,因此您应该可以ViewData[yourKey]在测试中使用.

所以你的测试看起来像这样:

[TestCase]
public void About()
{
    var controller = new AboutController();
    var ar = controller.About() as ViewResult;
    Assert.AreEqual("About Us", ar.ViewData["Title"]);
}
Run Code Online (Sandbox Code Playgroud)


Gig*_*apr 19

你有没有尝试过

Assert.AreEqual("About Us", controller.ViewBag.Title);
Run Code Online (Sandbox Code Playgroud)

这个对我有用


jpb*_*chi 6

控制器返回的ViewResult只有对应显示的视图的引用.此时甚至没有解决该视图.那里的代码永远不会被您的测试执行.

您应该做的是在控制器中设置ViewBag属性,而不是视图.通常,视图只会读取这些值.

希望能帮助到你


Dar*_*rov 5

不,您不能像这样测试视图。您可能得到的最接近的方法是将视图呈现到流编写器中,然后测试生成的 HTML。这不是单元测试中常见的事情。我建议您执行 Web 测试以验证视图是否正确。您可以使用Visual Studio创建 Web 测试,也可以使用免费的Selenium框架。