我正在编写测试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")
并明确定义要返回的视图,则可以正常工作。但是,如果可能的话,我想避免这种情况。是否有一种普遍接受的方法来解决这个问题?
答案 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");
}