3

我在我的 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);
}
4

2 回答 2

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);
}
于 2013-01-21T15:27:56.280 回答
0

AssertViewRendered().ForView() 针对您明确传递给 View() 的视图名称进行测试是您的控制器操作。如您所见,如果您没有在操作中指定视图名称,那么 .ForView() 将针对空字符串进行测试,如您所见。

如果您调用 View("Index"); 在您的操作中,您可以在测试中调用 .ForView("Index") 。

如果您的操作可以返回不同的可能视图,我认为这个断言将是最有用的。

于 2013-11-15T12:28:23.560 回答