Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何测试视图的渲染是否正确?_C#_Asp.net Mvc_Unit Testing_Tdd - Fatal编程技术网

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

C# 如何测试视图的渲染是否正确?,c#,asp.net-mvc,unit-testing,tdd,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 po

我刚刚写了我的第一个单元测试,现在我有一些问题。这就是所谓的测试:

[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);
}
[测试]
公共无效索引shouldReturnPosts()
{
//安排
var repository=Mock.Create();
var posts=新[]
{
新帖子{Title=“Hello”,Slug=“Hello”,Content=“Some Post.”,
新帖子{Title=“再见”,Slug=“再见”,Content=“一些帖子”。}
};
Mock.Arrange(()=>repository.GetAll()).Returns(posts);
var控制器=新的HomeController(存储库);
//表演
var result=controller.Index();
var模型=(Post[])结果。模型;
//断言
收集资产。AreEqual(职位、型号);
}
这个测试通过了,我明白为什么。但是,由于找不到任何视图,该网页实际上无法按预期工作

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


如何测试视图的渲染是否正确
它让你通过一个丰富的c#API自动化浏览器

单元测试…一个单元。如果您试图同时测试控制器和视图,则这不是单元测试。如果您想做一个集成测试并获得实际生成的html,请查看


编辑:如果您模拟/伪造了控制器和模型,您可能会对视图进行单元测试,但它可能会变得有点复杂,因为您还需要模拟ControllerContext(请参阅)。一旦这些都设置好了,您就可以使用如下方式将视图呈现为html。只需使用FindView而不是FindPartialView。如果cshtml中有任何错误,将抛出一个异常,您可以检测到该异常。您还可以检查html文本字符串,查看所需的元素/数据是否存在。

您可以测试一个控制器操作,该操作返回一个ViewResult(我认为这是您正在尝试执行的操作),如下所示:

var myController=新的myController([此处模拟的依赖项]);
myController.ControllerContext=mockedControllerContext;
var result=myController.MyActionWhichReturnsAViewResult();
Assert.IsNotNull(结果);
Assert.IsInstanceOf(结果);
Assert.That(result.ViewName==[expectedViewName])

也就是说,您不仅需要模拟控制器的依赖关系(如果它需要数据访问等),还需要模拟控制器所处的HTTP上下文。
Moq
库使这变得非常简单,下面是另一个堆栈溢出问题,可以帮助您解决它:

此测试与视图的呈现无关,此测试验证当您调用控制器时,您是否从注入的存储库返回结果。此后,我重新表述了我的问题。我想按照
IndexRendersView
编写另一个测试。这不符合测试单个单元的条件吗?更新了我的答案以回答您的问题。
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])