【问题标题】:How to unit test an ActionResult that returns a ContentResult?如何对返回 ContentResult 的 ActionResult 进行单元测试?
【发布时间】:2010-02-25 16:16:11
【问题描述】:

我想对以下 ASP.NET MVC 控制器索引操作进行单元测试。我应该用什么替换下面断言中的实际参数(用 ? 存根)。

using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
    public class StatusController : Controller
    {
        public ActionResult Index()
        {
            return Content("Hello World!");
        }
    }
}


[TestMethod]
public void TestMethod1()
{
    // Arrange
    var controller = CreateStatusController();

    // Act
    var result = controller.Index();

    // Assert
    Assert.AreEqual( "Hello World!.", ? );
}

【问题讨论】:

    标签: asp.net-mvc unit-testing actionresult


    【解决方案1】:

    使用“as”运算符进行可空转换。然后简单地检查一个空结果

    [TestMethod]
    public void TestMethod1()
    {
        // Arrange
        var controller = CreateStatusController();
    
        // Act
        var result = controller.Index() as ContentResult;
    
        // Assert
        Assert.NotNull(result);
        Assert.AreEqual( "Hello World!.", result.Content);
    }
    

    【讨论】:

      【解决方案2】:

      我喜欢为这类事情创建断言助手。例如,您可能会执行以下操作:

      public static class AssertActionResult {
          public static void IsContentResult(ActionResult result, string contentToMatch) {
              var contentResult = result as ContentResult;
              Assert.NotNull(contentResult);
              Assert.AreEqual(contentToMatch, contentResult.Content);        
          }
      }
      

      然后你可以这样称呼:

      [TestMethod]
      public void TestMethod1()
      {
          var controller = CreateStatusController();
          var result = controller.Index();
      
          AssertActionResult.IsContentResult(result, "Hello World!");    
      }
      

      我认为这使测试更容易阅读和编写。

      【讨论】:

      • 这是个好主意,赛斯。我有很多 ContentResult 单元测试要编码,所以这将有助于尝试保持 DRY 哲学。
      • @Nicholas:很高兴你发现它有帮助。我的其他助手是AssertActionResult.IsRedirectTo(result, url)AssertActionResult.IsViewResult(result, viewName)
      【解决方案3】:

      您无法测试结果不为空,您收到ContentResult 并比较值:

      [TestMethod]
      public void TestMethod1()
      {
          // Arrange
          var controller = CreateStatusController();
      
          // Act
          var result = controller.Index();
      
          // Assert
          Assert.NotNull(result);
          Assert.IsAssignableFrom(typeof(ContentResult), result);
          Assert.AreEqual( "Hello World!.", result.Content);
      }
      

      如果 Nunit 断言不符合要求,我表示歉意,但将其视为伪代码 :)

      【讨论】:

        猜你喜欢
        • 2013-09-22
        • 2019-04-23
        • 2020-06-07
        • 2018-12-31
        • 1970-01-01
        • 2020-09-27
        • 2020-09-28
        • 2014-05-10
        • 1970-01-01
        相关资源
        最近更新 更多