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

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为空。如果我更改调用方式,使用return View("FindX")并明确定义要返回的视图,则可以解决问题。但是,如果可能的话,我想避免这种情况。是否有一种通常被接受的方法来处理这种情况?


2
可能是ViewResult.ViewName属性在单元测试中为空的重复问题。 - Anton Gogolev
3个回答

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。


该行代码“Assert.IsNull(viewResult.ViewName);”应该改为“Assert.IsTrue(string.IsEmpty(viewResult.ViewName))”。在我的情况下,这个属性从未为null,而是为空。除此之外,我喜欢这个响应,因为它展示了一个更好地表达测试意图的方式。 - Manfred
甚至可以使用 Assert.IsNullOrEmpty(viewResult.ViewName)。 - Duncan

2

如果您没有设置视图名称,那么ViewName为空是正确且预期的结果,因此请根据此编写您的测试代码。

Assert.IsNull(view.ViewName);

@Xhalent - 这个看起来可能是个好主意,但我想要一个测试,可以判断“返回的操作是否正确”,因此我需要将其与某个特定的操作联系起来。经过调查后,ViewBag.Title似乎是一个合理的选择,因为它会有页面的正确标题。 - skaz
然后在控制器中设置视图名称。您不必将其留空。这是我的惯例,即使视图与操作名称匹配。 - Xhalent
@Xhalent - 抱歉 - 我觉得我没有解释清楚。我知道我可以在控制器中设置名称,但是在那里使用显式字符串文字感觉有点奇怪,因为默认情况下不带参数会自动转到正确的视图。我想知道是否有更好的方法。 - skaz
@skaz。说得好,我也不建议测试分配的文本。我在控制器类中将动作字符串设置为常量,然后与这些常量进行比较。这符合您的要求吗? - Xhalent
@Xhalent - 你能详细阐述一下吗?谢谢。 - skaz
这并不是正确的答案,但是评论解释了问题。 - skaz

0

那对我有用

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接