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

Unit testing MVC 3-单元测试控制器结果,unit-testing,asp.net-mvc-3,Unit Testing,Asp.net Mvc 3,我正在编写单元测试来测试MVC3控制器。我想确保从控制器返回的视图是正确的视图。在我的单元测试中,我有: [Test] public void It_Should_Return_The_Right_Page() { FormController fc = this.CreateFormController(); var view = fc.FindX();

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

[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为空。如果我将调用更改为说
returnview(“FindX”)
,并显式定义要返回的视图,它就可以工作。但是,如果可能的话,我希望避免这种情况。是否有一种普遍接受的方法来实现这一点?

如果没有设置viewname,那么viewname为null不是正确的预期结果,因此请相应地编写测试代码

Assert.IsNull(view.ViewName);

听起来您想要传达的是:断言此方法的默认视图已返回。表达这一点的一种方式是使用这一行:

var view = fc.FindX();

Assert.IsNull(view.ViewName) 
但这并不能很好地表达你的意图。一种更清楚地表达它的方法是在ActionResult或ViewResult上创建一个名为AssertsDefaultView的扩展方法,如下所示:

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();
有一组这样的断言(我认为方法的名称是AssertViewRendered),但我更喜欢自己编写扩展,这样我就能更好地理解MVC。

这对我来说很有用

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

@Xhalent可能是重复的-可能是,但我想做一个测试说“返回的操作是正确的”,所以我需要绑定到特定于该操作的东西。它看起来像ViewBag。在查看它之后,标题是一个合理的选择,因为它将具有页面的正确标题。然后在控制器中设置viewname。你不必把它留空。这是我理所当然要做的事情,即使视图与动作名称匹配。@Xhalent-对不起-我想我解释得不够好。我知道我可以在控制器中设置名称,但是在其中有一个显式的字符串文本感觉有点奇怪,因为没有参数的默认值无论如何都会进入正确的视图。“我想知道是否有更好的方法。”斯卡兹说。说得好,我也不建议测试指定的文本。我将动作字符串设置为控制器类中的常量,然后与这些常量进行比较。这就是你要找的吗?@Xhalent-你能详细解释一下吗?谢谢。行“Assert.IsNull(viewsult.ViewName);”应读取“Assert.IsTrue(string.IsEmpty(viewResult.ViewName))”。在我的例子中,这个属性永远不是null而是空的。除此之外,我喜欢这个响应,因为它展示了如何更好地表达test.or甚至Assert.IsNullOrEmpty(viewResult.ViewName)的意图;