如何测试我的视图是否正确渲染?

本文关键字:是否 视图 我的 何测试 测试 | 更新日期: 2023-09-27 18:11:34

我刚刚写了我的第一个单元测试,现在我有一些问题。下面是test:

[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);
}

这个测试通过了,我知道为什么。但是,由于没有找到视图,网页实际上并没有像预期的那样工作。

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

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

如何测试我的视图是否正确渲染?

你可以测试一个控制器动作,它返回一个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库使这很容易,这里是另一个堆栈溢出问题,它可能会帮助你:我如何在ASP中模拟HttpContext ?. NET MVC使用Moq?

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

编辑:你可能会做一个单元测试的视图提供你模拟/伪造的控制器和模型,但它可能会变得有点复杂,因为你还需要模拟控制器上下文(见mock Asp.net-mvc控制器上下文)。一旦这些都设置好了,就可以使用类似http://codetunnel.com/how-to-render-an-aspnet-mvc-view-to-a-string-from-within-the-controller的东西将视图呈现为html。使用FindView而不是FindPartialView。如果cshtml中有任何错误,将抛出一个可以检测到的异常。您还可以检查html文本字符串,看看是否存在您期望的元素/数据。

如果你想测试正确的视图被渲染,我会考虑做web测试。我选择的框架是Selenium,但也有其他可用的框架。

它可以让你通过一个丰富的c# API自动化浏览器