【问题标题】:How Can I Test That My View Is Rendered Correctly?如何测试我的视图是否正确呈现?
【发布时间】:2014-07-03 22:15:41
【问题描述】:

我刚刚编写了我的第一个单元测试,现在我有一些问题。这里是说测试:

[Test]
public void IndexShouldReturnPosts()
{
    // arrange
    var repository = Mock.Create<IRepository>();
    var posts = new [] 
    {
        new Post { Title = "Hello", Slug = "hello", Content = "Some post."},
        new Post { Title = "Goodbye", Slug = "goodbye", Content = "Some post."}
    };
    Mock.Arrange(() => repository.GetAll()).Returns(posts);
    var controller = new HomeController(repository);

    // act
    var result = controller.Index();
    var model = (Post[]) result.Model;

    // assert
    CollectionAssert.AreEqual(posts, model);
}

这个测试通过了,我明白为什么。但是,该网页实际上并没有按预期工作,因为找不到任何视图。

认为(如果我错了,请纠正我)我需要编写另一个测试来验证视图是否正确呈现,但我不知道如何。

如何测试我的视图是否正确呈现?

【问题讨论】:

  • 这个测试与渲染视图无关,这个测试验证当你调用你的控制器时,你会从注入的存储库中返回结果。

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


【解决方案1】:

您可以像这样测试返回 ViewResult 的控制器操作(我认为这是您正在尝试做的事情):

var myController = new MyController([mocked dependencies here]);
myController.ControllerContext = mockedControllerContext;
var result = myController.MyActionWhichReturnsAViewResult();

Assert.IsNotNull(result);
Assert.IsInstanceOf<ViewResult>(result);
Assert.That(result.ViewName == [expectedViewName])

也就是说,您不仅需要模拟控制器的依赖项(如果它需要数据访问等),还需要模拟控制器打算存在的 HTTP 上下文。 Moq 库使这变得非常简单,这里还有一个 Stack Overflow 问题可以帮助您:How do I mock the HttpContext in ASP.NET MVC using Moq?

【讨论】:

    【解决方案2】:

    单元测试测试...单个单元。如果您尝试同时测试控制器和视图,则它不是单元测试。如果您想进行集成测试并获取生成的实际 html,请查看 http://blog.stevensanderson.com/2009/06/11/integration-testing-your-aspnet-mvc-application/

    编辑:如果您模拟/伪造了控制器和模型,您可能可以对视图进行单元测试,但它可能会变得有点复杂,因为您还需要模拟 ControllerContext(请参阅Mocking Asp.net-mvc Controller Context)。完成所有设置后,您可以使用 http://codetunnel.com/how-to-render-an-aspnet-mvc-view-to-a-string-from-within-the-controller 之类的东西将视图呈现为 html。只需使用 FindView 而不是 FindPartialView。如果您的 cshtml 中有任何错误,则会引发您可以检测到的异常。您还可以检查 html 文本字符串以查看您期望的元素/数据是否存在。

    【讨论】:

    • 我已经改写了我的问题。我想按照IndexRendersView 的方式编写另一个 测试。这不符合测试单个单元的条件吗?
    • 根据您的问题更新了我的答案。
    【解决方案3】:

    如果您想测试是否呈现了正确的视图,我会考虑进行 Web 测试。我选择的框架是 Selenium,但还有其他可用的。

    它让您通过丰富的 c# API 自动化浏览器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      • 2018-04-25
      • 2020-12-11
      相关资源
      最近更新 更多