我在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 ''
但如果我覆盖View
以指定要返回的viewName
,则测试通过:
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安装的MvcContrib.Mvc3.TestHelper-ci 3.0.96.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);
}
答案 0 :(得分: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);
}
答案 1 :(得分:0)
AssertViewRendered()。ForView()针对您明确传递给View()的视图名称进行测试是您的控制器操作。如果您正在执行操作,则不会在操作中指定视图名称,那么.ForView()将针对空字符串进行测试,如您所见。
如果您调用View(“索引”);在您的操作中,您可以在测试中调用.ForView(“Index”)。
如果你的行动能够回归不同的观点,我认为这个断言最有用。