我在ASP.NET MVC 3项目中使用模板化助手。一个显示模板有一个拼写错误 - 一个意外的额外代码块 - 在返回该视图时导致编译器错误(“不要将@if放在代码块中”,你知道)。
一切都很好,除了调用该视图的测试方法仍然成功。我很难搞清楚如何在单元测试中使代码块失效。
这是错误的显示模板:
@model MemberSelectorViewModel
@{
Layout = "~/Views/Shared/_DisplayFormItem.cshtml";
}
@section DataContent {
@{ // <- this was the typo, and it...
@if (Model.idMember.HasValue) // <- causes this to throw a compiler error
{
@Html.ActionLink(Model.FullName, "Details", "Member", new { id = Model.idMember.Value }, null )
@Html.HiddenFor(m=> m.idMember)
}
}
}
这是我认为应该失败的测试:
[TestMethod]
public void DetailsReturnsView()
{
MemberJobController target = new MemberJobController(TestHarness.Context);
memberjob mj = TestHarness.UnitOfWork.MemberJobRepository.FirstOrDefault(x => true);
ActionResult result = target.Details(mj.idmemberjob); // <- this should hit the compiler error, I would have thought
Assert.IsNotNull(result);
}
但是那个测试成功了。
我知道如何编写一个在模板化助手的“@ {@if()”拼写错误中失败的测试吗?
答案 0 :(得分:1)
我认为你可能误解了单元测试如何在控制器上运行。他们从来没有真正看过这个观点因此,无论您在视图中执行了多少错误,当您在单元测试中调用控制器操作时,所发生的一切都是执行此操作的主体。就这样。它永远不会去视野。
因此,如果您想测试您的视图,则不再进行单元测试。您正在进行集成测试,其中您向站点发送HTTP请求,该站点部署在登台服务器上并验证返回的HTML是否符合您的要求。在这种情况下,如果您在视图中输入了拼写错误或某些内容,那么当您使用HTTP请求点击特定控制器操作时返回的实际HTML显然会与您预期的不同。