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

时间:2014-07-03 22:15:42

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

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

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

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

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

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

3 个答案:

答案 0 :(得分: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?

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

单元测试测试......一个单元。如果您尝试同时测试控制器和视图,则不是单元测试。如果您想进行集成测试并获得生成的实际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文本字符串,以查看您期望的元素/数据是否存在。