如何对返回ContentResult的ActionResult进行单元测试?

时间:2010-02-25 16:16:11

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

我想单元测试以下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!.", ? );
}

3 个答案:

答案 0 :(得分:20)

使用“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);
}

答案 1 :(得分:11)

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

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!");    
}

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

答案 2 :(得分:4)

您无法测试结果不为空,您收到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声明没有被保密,我会大肆宣传,但把它视为伪代码:)