【问题标题】:Unit Testing ViewResult in Asp.NET MVCAsp.NET MVC 中的单元测试 ViewResult
【发布时间】:2016-04-27 17:37:38
【问题描述】:

尽管 StackOverflow 上有几篇关于 MVC 中单元测试操作结果的帖子,但我有一个具体的问题......

这是我在控制器中的 ActionResult:

public ActionResult Index()
{
    return View(db.Products.ToList());
}

产品中的每个项目都有不同的属性,例如名称、照片、数量等。 我为这个方法写了一个测试方法。它看起来如下:

private CartEntity db = new CartEntity();

[TestMethod]
public void Test_Index()
{
    //Arrange
    ProductsController prodController = new ProductsController();

    ViewResult = prodController.Index();


}

在这种情况下我应该比较什么,因为没有参数被传递到索引操作中

【问题讨论】:

  • 根据您的代码 Index() 返回 ViewResult 而不是 RedirectToRouteResult 所以我对您的单元测试代码和您的问题感到困惑。
  • 嘿@Igor,谢谢..我的实际代码是错误的
  • Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult)); 根据您的最新更新仍然会失败。 Index 仍然返回 ViewResult
  • 1.您可以测试传递给ViewResult 的模型。 2.可以测试action方法名是空还是“Index”。 3.可以测试返回的类型是ViewResult类型。
  • 你不是在模拟你的数据库,所以这不是一个单元测试,而是一个集成测试。你可以检查db.Products.ToList()routeResult.ViewData.Model

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


【解决方案1】:

查看ViewResult 课程,它可以向您展示您还可以测试什么。 您需要做的是模拟您的DbContext 并在Products 属性(DbSet<>) 中为它提供数据,因为这是在您的控制器操作中调用的。 然后就可以测试了

  1. 返回的类型
  2. ViewResult 上的模型
  3. ViewName 应该为空或 Index

示例代码

[TestMethod]
public void Test_Index()
{
    //Arrange
    ProductsController prodController = new ProductsController(); // you should mock your DbContext and pass that in

    // Act
    var result = prodController.Index() as ViewResult;

    // Assert
    Assert.IsNotNull(result);
    Assert.IsNotNull(result.Model); // add additional checks on the Model
    Assert.IsTrue(string.IsNullOrEmpty(result.ViewName) || result.ViewName == "Index");
}

如果您在模拟 DbContext 时需要帮助,有关于此主题的现有框架和文章。这是来自微软的一个标题为Testing with a mocking framework。理想情况下,您应该使用 AutoFac 或 Unity 或 NInject 等 DI 框架(不胜枚举)将您的依赖项(包括 DbContext 实例)注入到 Controller 实例的构造函数中。这也使单元测试变得更加容易。

【讨论】:

  • 非常感谢。这对我更有帮助..谢谢
  • 我试过这个var result = prodController.Index() as ViewResult; 仍然得到空结果?有什么线索吗?
  • @Neo - 并非没有看到您的 Index 方法中的 return 语句。我建议在 Stack Overflow 上提出一个新问题,而不是尝试在 cmets 中解决它。
  • 使用相同的代码public ActionResult Index() { return View(db.Products.ToList()); }
  • 如果你想访问模型的任何属性记得转换result.Model,所以:var myModel = (MyModel)result.Model;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多