MVC 3 - 单元测试控制器结果

时间:2011-05-19 12:57:32

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

我正在编写测试MVC 3控制器的单元测试。我想确保从控制器返回的视图是正确的视图。在我的单元测试中,我有:

[Test]
            public void It_Should_Return_The_Right_Page()
            {
                FormController fc = this.CreateFormController();
                var view = fc.FindX();
                Assert.AreEqual("FindX", view.ViewName);
            }

在我的控制器中,我有:

public ViewResult FindX()
        {
            return View();
        }

此操作失败,因为ViewName为null。如果我将调用更改为说return View("FindX")并明确定义要返回的视图,则可以正常工作。但是,如果可能的话,我想避免这种情况。是否有一种普遍接受的方法来解决这个问题?

3 个答案:

答案 0 :(得分:4)

听起来你想传达的是:断言返回了此方法的默认视图。传达此信息的一种方法是使用以下行:

var view = fc.FindX();

Assert.IsNull(view.ViewName) 

但这并不能很好地传达你的意图。更清楚地传达它的一种方法是在ActionResult或ViewResult上创建一个名为AssertIsDefaultView的扩展方法,如下所示:

public static class ActionResultAssertions
{
    public static void AssertIsDefaultView(this ActionResult actionResult)
    {
        var viewResult = actionResult as ViewResult;

        Assert.IsNotNull(viewResult);
        Assert.IsNull(viewResult.ViewName);
    }
}

然后在你的测试中你可以说:

var view = fc.FindX();
view.AssertIsDefaultView();

MvcContrib有一组这些断言(我认为该方法的名称是AssertViewRendered),但我更喜欢自己编写扩展,以便更好地理解MVC。

答案 1 :(得分:2)

如果您没有设置视图名称,那么ViewName不是正确和预期结果的null,因此请相应地编写测试代码。

Assert.IsNull(view.ViewName);

答案 2 :(得分:0)

对我有用

public ViewResult FindX()
    {
        return View("FindX");
    }