Asp.net mvc 3 在将T4MVC与MvcContrib.TestHelper AssertViewRendered一起使用时,如何测试默认视图

Asp.net mvc 3 在将T4MVC与MvcContrib.TestHelper AssertViewRendered一起使用时,如何测试默认视图,asp.net-mvc-3,t4mvc,mvccontrib-testhelper,Asp.net Mvc 3,T4mvc,Mvccontrib Testhelper,我正在ASP.NET MVC 3项目中使用T4MVC。我有以下基本测试: [TestMethod] public void IndexReturnsIndexView() { var controller = new HomeController(); var result = controller.Index(); result.AssertViewRendered().ForView(MVC.Home.Views.Index); } 如果控制器方法返回默认视图,则

我正在ASP.NET MVC 3项目中使用T4MVC。我有以下基本测试:

[TestMethod]
public void IndexReturnsIndexView()
{
    var controller = new HomeController();
    var result = controller.Index();

    result.AssertViewRendered().ForView(MVC.Home.Views.Index);
}
如果控制器方法返回默认视图,则测试失败:

public virtual ActionResult Index()
{
    return View();
}
给出的错误是:

MvcContrib.TestHelper.ActionResultAssertionException: Expected view name '~/Views/Home/Index.cshtml', actual was ''
但如果我覆盖
视图
以指定返回哪个
视图名
,则测试通过:

public virtual ActionResult Index()
{
    return View(MVC.Home.Views.Index);
}
我尝试使用以下断言,但仍然没有成功:

result.AssertViewRendered().ForView(MVC.Home.Index().GetT4MVCResult().Action);
出现以下错误:

MvcContrib.TestHelper.ActionResultAssertionException: Expected view name 'Index', actual was ''
然后我意识到我误读了断言失败,所以我将测试改为:

result.AssertViewRendered().ForView(String.Empty);
测试通过了,但测试本身似乎毫无用处

最好我不想按名称指定所有视图,那么如何测试它呢?为了澄清,我使用的是,我今天从NuGet安装的

更新 这并不是问题的答案,但我已经开始做以下工作,这为测试用例提供了更多价值:

using (var controller = new FeatureController(mockGateway))
{
    // Act
    var result = controller.Index();
    var model = result.ViewData.Model as MyModel;

    // Assert
    Assert.IsNotNull(model, "Model is null or wrong type");
    result.AssertViewRendered().WithViewData<MyModel>();

    // Alternative Assert for model data
    Assert.IsTrue(model.Items.Count > 0);
}
使用(var控制器=新功能控制器(mockGateway))
{
//表演
var result=controller.Index();
var model=result.ViewData.model作为MyModel;
//断言
IsNotNull(model,“model为null或错误类型”);
result.AssertViewRendered().WithViewData();
//模型数据的替代断言
Assert.IsTrue(model.Items.Count>0);
}

我把这个问题保留了相当长的一段时间,以便其他任何人都可以回答。我现在自己来回答这个问题

以下检查以确保返回的视图包含预期的模型,以及该模型中更合适的数据。对于所讨论的控制器来说,这是一个更好的单元测试

using (var controller = new FeatureController(mockGateway))
{
    // Act
    var result = controller.Index();
    var model = result.ViewData.Model as MyModel;

    // Assert
    Assert.IsNotNull(model, "Model is null or wrong type");
    result.AssertViewRendered().WithViewData<MyModel>();

    // Alternative Assert for model data
    Assert.IsTrue(model.Items.Count > 0);
}
使用(var控制器=新功能控制器(mockGateway))
{
//表演
var result=controller.Index();
var model=result.ViewData.model作为MyModel;
//断言
IsNotNull(model,“model为null或错误类型”);
result.AssertViewRendered().WithViewData();
//模型数据的替代断言
Assert.IsTrue(model.Items.Count>0);
}
AssertViewRendered()。ForView()针对您显式传递给view()的视图名称进行测试,这是您的控制器操作。如您所见,如果您在操作中没有指定视图名称,那么.ForView()将针对空字符串进行测试

如果您调用视图(“索引”);在您的操作中,您可以在测试中调用.ForView(“Index”)

我认为,如果你的行动能够返回不同的可能观点,那么这个断言将是最有用的