c# - 在 ASP.NET MVC 中对呈现的 View 进行单元测试

标签 c# asp.net-mvc unit-testing

我很抱歉再次敲打这个鼓,但我一直在寻找一种方法来单元测试在 ASP.NET MVC(当前使用 v2)中呈现的 View 。

我对使用 WatiN 或 Selenium 来做这件事不是 100% 满意,它们都是很棒的工具,但是对如此简单的场景进行测试需要花费太长时间,并且测试的方式比我多得多需要。

我也对“不应测试 View ”的口头禅深感不满,该口头禅似乎源于 View 的根本原因,在当前状态下,无法在更大的集成测试之外进行测试。 :)

我已经使用“AssertViewRendered().For("Index").WithViewData()”等对 Controller 进行了测试。我只是想说明数据在 View 打开时显示模型。

想象一下这个简单的场景:

Controller :

public class SimpleController : Controller
{
    public void Index()
    {
        var vm = new SimpleViewModel { Message = "Hello world!" };
        return View(vm);
    }
}

还有这个简单的 View 模型:

public class SimpleViewModel
{
    public string Message { get; set; }
}

还有一个简单的 View :

`<%@ Page Language="C#"` `Inherits="System.Web.Mvc.ViewPage<SimpleViewModel>" %>`
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml">
    <body>
        <h1><%= Model.Message %></h1>
    </body>
    </html>

我如何通过一个简单的单元测试来自动化 View 实际上使用消息属性,而不需要使用像 WatiN 这样的重量级集成测试工具,并且没有网络服务器?

像这样的东西是理想的:

    [TestMethod]
    public void ShouldDisplayMessage()
    {
        const string helloWorld = "Hello world!";
        var view = new SimpleView(new SimpleViewModel { Message = helloWorld });
        var result = view.GetRenderedString();
        Assert.IsTrue(result.Contains(helloWorld));
    }

最佳答案

此问题是您的 View 文件包含影响 View 的其他信息(也称为标记)。您可以测试 View 模型以在 View 模型中包含正确的信息,但我不确定这正是您想要的。

您可以在查看模型时转换 ViewResult.ViewData.Model 并从那里断言值。

    [Test]
    public Test()
    {
        var homeController = new HomeController();
        var result = homeController.About() as ViewResult();
        Assert.IsInstanceOf(typeof(MyViewModel),result.ViewData.Model);
        var myModel = result.ViewData.Model as MyViewModel;
        Assert.That(myModel.Name,Is.EqualTo("Hello World")  );

    }

如果你使用了 spark View 引擎,事情可能会更容易一些

http://darrell.mozingo.net/2010/01/28/in-memory-view-rendering-with-spark/

关于c# - 在 ASP.NET MVC 中对呈现的 View 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5262982/

相关文章:

c# - CLR 函数中的反序列化失败

c# - 如何停止文本框上的CSS类

asp.net-mvc - 是否可以在 ASP.NET MVC 中实现 X-HTTP-Method-Override?

jquery - 我没有获得数据属性的值

java - Spring MVC : How to unit test Model's attribute from a controller method that returns String?

c# - 测试资源管理器和测试输出窗口中的测试数量不同

c# - 150K 行的散点图永远加载?

c# - CS0411 : The type arguments for method X cannot be inferred from the usage when building with TeamCity

asp.net-mvc - ASP.NET MVC 部分 View : input name prefixes

java - Android Studio 单元测试 SQLiteDataBase 为空